1. 24 Apr, 2018 2 commits
    • LRN's avatar
      GDK W32: Switch to GdkCairoContext · 7002f08c
      LRN authored
      * Remove DC refcounting (we trust GDK to always do
        begin_frame/end_frame calls in pairs)
      * Now that there's no GDK-provided double-buffer up the stack,
        double-buffering is implemented here
        (though it's disabled by default - in my tests it didn't provide
         any visual improvements, but did decrease performance).
      * For some reason delaying window resizes until the point where
        we need to blit the double-buffer into the window leads
        to visual glitches, so doulbe-buffered windows are resized
        in begin_frame, same as non-double-buffered ones.
      * New code to clear the paint region, for all drawing modes.
        Hopefully, it isn't duplicated anywhere up the stack.
      * GL has its own context now, so remove any GL-related comments.
      * Layered windows are still used (because cairo actually works
        better with them)
      * A bit more code re-use for layered windows
      * Some functions that were local to gdksurface-win32.c are made
        usable for the whole backend
      * Drag-indicator drawing is temporarily commented out to match
        a similar change in X11 backend
    • Benjamin Otte's avatar
      gdk: Add Cairo context implementations for all backends · 813e9c95
      Benjamin Otte authored
      And make the GdkCairoContext as abstract.
      The idea of this and thje following commits is to get rid of all
      Cairo code in gdksurface.c (and $backend/gdksurface-$backend.c)
      by moving that code into the Cairo context files.
      In particular, the GdkSurfaceClass.begin_frame/end_frame()
      functions (which are currently exclusively used by the Cairo code
      should end up being moved to GdkDrawContextClass.begin/end_frame().
      This has multiple benefits:
      1. It unifies code between the different drawing contexts.
         GL lives in GLContext, Vulkan in VulkanContext and Cairo in
         CairoContext. In turn, this makes it way easier to reason about
         what's going on in surface-specific code. Currently pretty much
         all backends do things wrong when they want to sync to drawing
         or to the frame clock.
      2. It makes the API of GdkSurface smaller. No drawing code (apart
         from creating the contexts) needs to remain.
      3. It confines Cairo to the Drawcontext, thereby making it way
         more obvious when backends are still using it in situations
         where it may now conflict with OpenGL (like when doing the dnd
         failed animation or in the APIs that I'm removing in this
      4. We have 2 very different types of Cairo contexts: The X/win32
         model, where we have a natively supported Cairo backend but do
         double buffering ourselves and use similar surfaces and the
         Wayland/Broadway model where we use image surfaces without any
         Cairo backend support and have to submit the buffers manually.
         By not sharing code between those 2 versions, we can make the
         actual code way smaller. We also get around the need to create
         1x1 image surfaces in the Wayland backend where we pretend
         there's a native Cairo surface.