summaryrefslogtreecommitdiff
path: root/gdk/gdkdisplayprivate.h
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2014-10-09 10:45:44 +0200
committerMatthias Clasen <mclasen@redhat.com>2014-10-13 10:43:31 -0400
commit038aac6275f829c1e92e634ba4a310a03c0871e6 (patch)
tree365ee83f0dbe829bcc8c0a3bda6dcea740526800 /gdk/gdkdisplayprivate.h
parentd0147a6f2cbc4903bc6969bde29de7bb068eae71 (diff)
downloadgtk+-038aac6275f829c1e92e634ba4a310a03c0871e6.tar.gz
gdk: Add support for OpenGL
This adds the new type GdkGLContext that wraps an OpenGL context for a particular native window. It also adds support for the gdk paint machinery to use OpenGL to draw everything. As soon as anyone creates a GL context for a native window we create a "paint context" for that GdkWindow and switch to using GL for painting it. This commit contains only an implementation for X11 (using GLX). The way painting works is that all client gl contexts draw into offscreen buffers rather than directly to the back buffer, and the way something gets onto the window is by using gdk_cairo_draw_from_gl() to draw part of that buffer onto the draw cairo context. As a fallback (if we're doing redirected drawing or some effect like a cairo_push_group()) we read back the gl buffer into memory and composite using cairo. This means that GL rendering works in all cases, including rendering to a PDF. However, this is not particularly fast. In the *typical* case, where we're drawing directly to the window in the regular paint loop we hit the fast path. The fast path uses opengl to draw the buffer to the window back buffer, either by blitting or texturing. Then we track the region that was drawn, and when the draw ends we paint the normal cairo surface to the window (using texture-from-pixmap in the X11 case, or texture from cairo image otherwise) in the regions where there is no gl painted. There are some complexities wrt layering of gl and cairo areas though: * We track via gdk_window_mark_paint_from_clip() whenever gtk is painting over a region we previously rendered with opengl (flushed_region). This area (needs_blend_region) is blended rather than copied at the end of the frame. * If we're drawing a gl texture with alpha we first copy the current cairo_surface inside the target region to the back buffer before we blend over it. These two operations allow us full stacking of transparent gl and cairo regions.
Diffstat (limited to 'gdk/gdkdisplayprivate.h')
-rw-r--r--gdk/gdkdisplayprivate.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/gdk/gdkdisplayprivate.h b/gdk/gdkdisplayprivate.h
index 7911d25f4f..65f134e9c2 100644
--- a/gdk/gdkdisplayprivate.h
+++ b/gdk/gdkdisplayprivate.h
@@ -225,6 +225,11 @@ struct _GdkDisplayClass
gchar * (*utf8_to_string_target) (GdkDisplay *display,
const gchar *text);
+ gboolean (*make_gl_context_current) (GdkDisplay *display,
+ GdkGLContext *context);
+ void (*destroy_gl_context) (GdkDisplay *display,
+ GdkGLContext *context);
+
/* Signals */
void (*opened) (GdkDisplay *display);
void (*closed) (GdkDisplay *display,
@@ -303,6 +308,12 @@ void _gdk_display_create_window_impl (GdkDisplay *display
gint attributes_mask);
GdkWindow * _gdk_display_create_window (GdkDisplay *display);
+void gdk_display_destroy_gl_context (GdkDisplay *display,
+ GdkGLContext *context);
+gboolean gdk_display_make_gl_context_current (GdkDisplay *display,
+ GdkGLContext *context);
+GdkGLContext * gdk_display_get_current_gl_context (GdkDisplay *display);
+
G_END_DECLS
#endif /* __GDK_DISPLAY_PRIVATE_H__ */