3 /***************************
4 * GtkGlExt implementation *
5 ***************************/
6 #if defined(USE_GTKGLEXT)
8 void gtk_gl_enable(GtkWidget *widget)
10 GdkGLConfig *glconfig = gdk_gl_config_new_by_mode(
11 GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH |
12 GDK_GL_MODE_ALPHA | GDK_GL_MODE_DOUBLE);
13 gtk_widget_set_gl_capability(widget,
14 glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
17 void gtk_gl_begin(GtkWidget *widget)
19 GdkGLContext *glcontext = gtk_widget_get_gl_context(widget);
20 GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget);
21 gdk_gl_drawable_gl_begin(gldrawable, glcontext);
24 void gtk_gl_end(GtkWidget *widget)
26 GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget);
27 gdk_gl_drawable_swap_buffers(gldrawable);
28 gdk_gl_drawable_gl_end(gldrawable);
31 void gtk_gl_disable(GtkWidget *widget)
36 /**********************
37 * X11 implementation *
38 **********************/
39 #elif defined(USE_GLX)
42 void gtk_gl_enable(GtkWidget *widget)
44 g_debug("GtkGl: enable");
45 GdkScreen *screen = gdk_screen_get_default();
46 Display *xdisplay = GDK_SCREEN_XDISPLAY(screen);
47 gint nscreen = GDK_SCREEN_XNUMBER(screen);
50 int attribs[] = {GLX_RGBA,
58 XVisualInfo *xvinfo = glXChooseVisual(xdisplay, nscreen, attribs);
59 GLXContext context = glXCreateContext(xdisplay, xvinfo, NULL, False);
60 g_object_set_data(G_OBJECT(widget), "glcontext", context);
63 GdkVisual *visual = gdk_x11_screen_lookup_visual(screen, xvinfo->visualid);
64 GdkColormap *cmap = gdk_colormap_new(visual, FALSE);
65 gtk_widget_set_colormap(widget, cmap);
67 /* Disable GTK double buffering */
68 gtk_widget_set_double_buffered(widget, FALSE);
71 void gtk_gl_begin(GtkWidget *widget)
73 g_debug("GtkGl: begin");
74 Display *xdisplay = GDK_SCREEN_XDISPLAY(gtk_widget_get_screen(widget));
75 Window xwindow = GDK_WINDOW_XID(gtk_widget_get_window(widget));
76 GLXContext context = g_object_get_data(G_OBJECT(widget), "glcontext");
77 glXMakeCurrent(xdisplay, xwindow, context);
80 void gtk_gl_end(GtkWidget *widget)
82 g_debug("GtkGl: end");
83 Display *xdisplay = GDK_SCREEN_XDISPLAY(gtk_widget_get_screen(widget));
84 Window xwindow = GDK_WINDOW_XID(gtk_widget_get_window(widget));
85 glXSwapBuffers(xdisplay, xwindow);
88 void gtk_gl_disable(GtkWidget *widget)
90 g_debug("GtkGl: disable");
91 Display *xdisplay = GDK_SCREEN_XDISPLAY(gtk_widget_get_screen(widget));
92 GLXContext context = g_object_get_data(G_OBJECT(widget), "glcontext");
93 glXDestroyContext(xdisplay, context);
97 /************************
98 * Win32 implementation *
99 ************************/
100 #elif defined(USE_WGL)
102 #include <gdk/gdkwin32.h>
103 static void on_realize(GtkWidget *widget, gpointer _)
105 g_debug("GtkGl: on_realize");
106 gdk_window_ensure_native(gtk_widget_get_window(widget));
107 gtk_widget_set_double_buffered(widget, FALSE);
109 HWND hwnd = GDK_WINDOW_HWND(gtk_widget_get_window(widget));
110 HDC hDC = GetDC(hwnd);
112 PIXELFORMATDESCRIPTOR pfd = {
113 .nSize = sizeof(pfd),
115 .dwFlags = PFD_DRAW_TO_WINDOW
118 //.dwFlags = PFD_SUPPORT_OPENGL
119 // | PFD_DRAW_TO_WINDOW,
120 .iPixelType = PFD_TYPE_RGBA,
124 .iLayerType = PFD_MAIN_PLANE,
126 int pf = ChoosePixelFormat(hDC, &pfd);
128 g_error("GtkGl: ChoosePixelFormat failed");
129 if (!SetPixelFormat(hDC, pf, &pfd))
130 g_error("GtkGl: SetPixelFormat failed");
131 HGLRC hRC = wglCreateContext(hDC);
133 g_error("GtkGl: wglCreateContext failed");
134 g_object_set_data(G_OBJECT(widget), "glcontext", hRC);
137 void gtk_gl_enable(GtkWidget *widget)
139 g_debug("GtkGl: enable");
140 g_signal_connect(widget, "realize", G_CALLBACK(on_realize), NULL);
143 void gtk_gl_begin(GtkWidget *widget)
145 g_debug("GtkGl: begin");
146 HWND hwnd = GDK_WINDOW_HWND(gtk_widget_get_window(widget));
147 HDC hDC = GetDC(hwnd);
148 HGLRC hRC = g_object_get_data(G_OBJECT(widget), "glcontext");
149 if (!wglMakeCurrent(hDC, hRC))
150 g_error("GtkGl: wglMakeCurrent failed");
153 void gtk_gl_end(GtkWidget *widget)
155 g_debug("GtkGl: end");
156 HWND hwnd = GDK_WINDOW_HWND(gtk_widget_get_window(widget));
157 HDC hDC = GetDC(hwnd);
158 if (!SwapBuffers(hDC))
159 g_error("GtkGl: SwapBuffers failed");
162 void gtk_gl_disable(GtkWidget *widget)
164 g_debug("GtkGl: disable");
165 HGLRC hRC = g_object_get_data(G_OBJECT(widget), "glcontext");
166 wglDeleteContext(hRC);
171 /**************************
172 * Mac OSX implementation *
173 **************************/
174 #elif defined(USE_CGL)
175 void gtk_gl_enable(GtkWidget *widget)
177 CGDisplayCapture( kCGDirectMainDisplay );
178 CGLPixelFormatAttribute attribs[] =
183 kCGLPFAStencilSize, ( CGLPixelFormatAttribute ) 8,
184 kCGLPFADisplayMask, ( CGLPixelFormatAttribute ) CGDisplayIDToOpenGLDisplayMask( kCGDirectMainDisplay ),
185 ( CGLPixelFormatAttribute ) NULL
188 CGLPixelFormatObj pixelFormatObj;
189 GLint numPixelFormats;
190 CGLChoosePixelFormat( attribs, &pixelFormatObj, &numPixelFormats );
192 CGLCreateContext( pixelFormatObj, NULL, &contextObj );
194 CGLDestroyPixelFormat( pixelFormatObj );
196 CGLSetCurrentContext( contextObj );
197 CGLSetFullScreen( contextObj );
200 void gtk_gl_begin(GtkWidget *widget)
204 void gtk_gl_end(GtkWidget *widget)
208 void gtk_gl_disable(GtkWidget *widget)
213 /****************************
214 * Undefined implementation *
215 ****************************/
217 #warning "Unimplemented GtkGl"
218 void gtk_gl_enable(GtkWidget *widget) { }
219 void gtk_gl_begin(GtkWidget *widget) { }
220 void gtk_gl_end(GtkWidget *widget) { }
221 void gtk_gl_disable(GtkWidget *widget) { }