2 * Copyright (C) 2009-2011 Andy Spencer <andy753421@gmail.com>
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 /***************************
21 * GtkGlExt implementation *
22 ***************************/
23 #if defined(SYS_GTKGLEXT)
24 #include <gtk/gtkgl.h>
25 void gtk_gl_enable(GtkWidget *widget)
27 GdkGLConfig *glconfig = gdk_gl_config_new_by_mode(
28 GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH |
29 GDK_GL_MODE_ALPHA | GDK_GL_MODE_DOUBLE);
30 gtk_widget_set_gl_capability(widget,
31 glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
34 void gtk_gl_begin(GtkWidget *widget)
36 GdkGLContext *glcontext = gtk_widget_get_gl_context(widget);
37 GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget);
38 gdk_gl_drawable_gl_begin(gldrawable, glcontext);
41 void gtk_gl_end(GtkWidget *widget)
43 GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget);
44 gdk_gl_drawable_swap_buffers(gldrawable);
45 gdk_gl_drawable_gl_end(gldrawable);
48 void gtk_gl_disable(GtkWidget *widget)
53 /**********************
54 * X11 implementation *
55 **********************/
56 #elif defined(SYS_X11)
59 void gtk_gl_enable(GtkWidget *widget)
61 g_debug("GtkGl: enable");
62 GdkScreen *screen = gdk_screen_get_default();
63 Display *xdisplay = GDK_SCREEN_XDISPLAY(screen);
64 gint nscreen = GDK_SCREEN_XNUMBER(screen);
67 int attribs[] = {GLX_RGBA,
75 XVisualInfo *xvinfo = glXChooseVisual(xdisplay, nscreen, attribs);
77 g_error("GtkGl: enable - unable to get valid OpenGL Visual");
78 GLXContext context = glXCreateContext(xdisplay, xvinfo, NULL, False);
79 g_object_set_data(G_OBJECT(widget), "glcontext", context);
82 GdkVisual *visual = gdk_x11_screen_lookup_visual(screen, xvinfo->visualid);
83 GdkColormap *cmap = gdk_colormap_new(visual, FALSE);
84 gtk_widget_set_colormap(widget, cmap);
86 /* Disable GTK double buffering */
87 gtk_widget_set_double_buffered(widget, FALSE);
90 void gtk_gl_begin(GtkWidget *widget)
92 g_debug("GtkGl: begin");
93 Display *xdisplay = GDK_SCREEN_XDISPLAY(gtk_widget_get_screen(widget));
94 Window xwindow = GDK_WINDOW_XID(gtk_widget_get_window(widget));
95 GLXContext context = g_object_get_data(G_OBJECT(widget), "glcontext");
96 glXMakeCurrent(xdisplay, xwindow, context);
99 void gtk_gl_end(GtkWidget *widget)
101 g_debug("GtkGl: end");
102 Display *xdisplay = GDK_SCREEN_XDISPLAY(gtk_widget_get_screen(widget));
103 Window xwindow = GDK_WINDOW_XID(gtk_widget_get_window(widget));
104 glXSwapBuffers(xdisplay, xwindow);
107 void gtk_gl_disable(GtkWidget *widget)
109 g_debug("GtkGl: disable");
110 Display *xdisplay = GDK_SCREEN_XDISPLAY(gtk_widget_get_screen(widget));
111 GLXContext context = g_object_get_data(G_OBJECT(widget), "glcontext");
112 glXDestroyContext(xdisplay, context);
116 /************************
117 * Win32 implementation *
118 ************************/
119 #elif defined(SYS_WIN)
121 #include <gdk/gdkwin32.h>
122 static void on_realize(GtkWidget *widget, gpointer _)
124 g_debug("GtkGl: on_realize");
125 gdk_window_ensure_native(gtk_widget_get_window(widget));
126 gtk_widget_set_double_buffered(widget, FALSE);
128 HWND hwnd = GDK_WINDOW_HWND(gtk_widget_get_window(widget));
129 HDC hDC = GetDC(hwnd);
131 PIXELFORMATDESCRIPTOR pfd = {
132 .nSize = sizeof(pfd),
134 .dwFlags = PFD_DRAW_TO_WINDOW
137 //.dwFlags = PFD_SUPPORT_OPENGL
138 // | PFD_DRAW_TO_WINDOW,
139 .iPixelType = PFD_TYPE_RGBA,
143 .iLayerType = PFD_MAIN_PLANE,
145 int pf = ChoosePixelFormat(hDC, &pfd);
147 g_error("GtkGl: ChoosePixelFormat failed");
148 if (!SetPixelFormat(hDC, pf, &pfd))
149 g_error("GtkGl: SetPixelFormat failed");
150 HGLRC hRC = wglCreateContext(hDC);
152 g_error("GtkGl: wglCreateContext failed");
153 g_object_set_data(G_OBJECT(widget), "glcontext", hRC);
156 void gtk_gl_enable(GtkWidget *widget)
158 g_debug("GtkGl: enable");
159 g_signal_connect(widget, "realize", G_CALLBACK(on_realize), NULL);
162 void gtk_gl_begin(GtkWidget *widget)
164 g_debug("GtkGl: begin");
165 HWND hwnd = GDK_WINDOW_HWND(gtk_widget_get_window(widget));
166 HDC hDC = GetDC(hwnd);
167 HGLRC hRC = g_object_get_data(G_OBJECT(widget), "glcontext");
168 if (!wglMakeCurrent(hDC, hRC))
169 g_error("GtkGl: wglMakeCurrent failed");
172 void gtk_gl_end(GtkWidget *widget)
174 g_debug("GtkGl: end");
175 HWND hwnd = GDK_WINDOW_HWND(gtk_widget_get_window(widget));
176 HDC hDC = GetDC(hwnd);
177 if (!SwapBuffers(hDC))
178 g_error("GtkGl: SwapBuffers failed");
181 void gtk_gl_disable(GtkWidget *widget)
183 g_debug("GtkGl: disable");
184 HGLRC hRC = g_object_get_data(G_OBJECT(widget), "glcontext");
185 wglDeleteContext(hRC);
190 /**************************
191 * Mac OSX implementation *
192 **************************/
193 #elif defined(SYS_MAC)
194 #include <gdk/gdkquartz.h>
195 void gtk_gl_enable(GtkWidget *widget)
197 g_debug("GtkGl: enable");
200 NSOpenGLPixelFormatAttribute attribs[] = {
201 NSOpenGLPFAColorSize, 24,
202 NSOpenGLPFAAlphaSize, 8,
203 NSOpenGLPFADepthSize, 1,
204 NSOpenGLPFADoubleBuffer,
207 NSOpenGLPixelFormat *pix = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs];
208 NSOpenGLContext *ctx = [[NSOpenGLContext alloc] initWithFormat:pix shareContext:nil];
210 /* Attach to widget */
211 gtk_widget_set_double_buffered(widget, FALSE);
214 g_object_set_data(G_OBJECT(widget), "glcontext", ctx);
217 void gtk_gl_begin(GtkWidget *widget)
219 g_debug("GtkGl: begin");
221 gdk_window_ensure_native(gtk_widget_get_window(widget));
222 gtk_widget_get_allocation(widget, &alloc);
224 NSOpenGLContext *ctx = g_object_get_data(G_OBJECT(widget), "glcontext");
225 GdkWindow *win = gtk_widget_get_window(widget);
226 NSView *view = gdk_quartz_window_get_nsview(win);
227 NSRect rect = NSMakeRect(alloc.x, alloc.y, alloc.width, alloc.height);
230 [ctx makeCurrentContext];
232 [view setFrame:rect];
235 void gtk_gl_end(GtkWidget *widget)
237 g_debug("GtkGl: end");
238 NSOpenGLContext *ctx = g_object_get_data(G_OBJECT(widget), "glcontext");
242 void gtk_gl_disable(GtkWidget *widget)
244 g_debug("GtkGl: disable");
248 /****************************
249 * Undefined implementation *
250 ****************************/
252 #warning "Unimplemented GtkGl"
253 void gtk_gl_enable(GtkWidget *widget) { }
254 void gtk_gl_begin(GtkWidget *widget) { }
255 void gtk_gl_end(GtkWidget *widget) { }
256 void gtk_gl_disable(GtkWidget *widget) { }