Skip to content
  • Alexander Larsson's avatar
    gdk: Add support for OpenGL · 038aac62
    Alexander Larsson authored
    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.
    038aac62