[gtk/wip/chergert/for-main: 7/10] macos: rely on GdkMacosBuffer for damage tracking




commit 6d3492fec4f0aa37fddc789e62d5945f9bb4ca2b
Author: Christian Hergert <christian hergert me>
Date:   Mon Feb 28 22:51:31 2022 -0800

    macos: rely on GdkMacosBuffer for damage tracking
    
    This makes the damage tracking similar to what is done in the
    GdkMacosCairoContext object. We can store the unmodified damage area for
    the buffer and refer to that when requested. This fixes an issue where
    switching monitors might give us a new buffer but still clip to the damage
    area of the now defunct IOSurface.

 gdk/macos/gdkmacosglcontext-private.h |  2 --
 gdk/macos/gdkmacosglcontext.c         | 19 ++++++++++---------
 2 files changed, 10 insertions(+), 11 deletions(-)
---
diff --git a/gdk/macos/gdkmacosglcontext-private.h b/gdk/macos/gdkmacosglcontext-private.h
index 8b3eac2ca6..7355ffef90 100644
--- a/gdk/macos/gdkmacosglcontext-private.h
+++ b/gdk/macos/gdkmacosglcontext-private.h
@@ -38,8 +38,6 @@ struct _GdkMacosGLContext
 {
   GdkGLContext parent_instance;
 
-  cairo_region_t *damage;
-
   G_GNUC_BEGIN_IGNORE_DEPRECATIONS
   CGLContextObj cgl_context;
   G_GNUC_END_IGNORE_DEPRECATIONS
diff --git a/gdk/macos/gdkmacosglcontext.c b/gdk/macos/gdkmacosglcontext.c
index 5baff95a9b..ff7ae975c8 100644
--- a/gdk/macos/gdkmacosglcontext.c
+++ b/gdk/macos/gdkmacosglcontext.c
@@ -469,6 +469,7 @@ gdk_macos_gl_context_begin_frame (GdkDrawContext *context,
   buffer = _gdk_macos_surface_get_buffer (GDK_MACOS_SURFACE (surface));
 
   _gdk_macos_buffer_set_flipped (buffer, TRUE);
+  _gdk_macos_buffer_set_damage (buffer, region);
 
   /* Create our render target and bind it */
   gdk_gl_context_make_current (GDK_GL_CONTEXT (self));
@@ -476,9 +477,6 @@ gdk_macos_gl_context_begin_frame (GdkDrawContext *context,
 
   GDK_DRAW_CONTEXT_CLASS (gdk_macos_gl_context_parent_class)->begin_frame (context, prefers_high_depth, 
region);
 
-  g_clear_pointer (&self->damage, cairo_region_destroy);
-  self->damage = g_steal_pointer (&copy);
-
   gdk_gl_context_make_current (GDK_GL_CONTEXT (self));
   CHECK_GL (NULL, glBindFramebuffer (GL_FRAMEBUFFER, self->fbo));
 }
@@ -531,8 +529,6 @@ gdk_macos_gl_context_surface_resized (GdkDrawContext *draw_context)
 
   g_assert (GDK_IS_MACOS_GL_CONTEXT (self));
 
-  g_clear_pointer (&self->damage, cairo_region_destroy);
-
   if (self->cgl_context != NULL)
     CGLUpdateContext (self->cgl_context);
 }
@@ -587,9 +583,16 @@ static cairo_region_t *
 gdk_macos_gl_context_get_damage (GdkGLContext *context)
 {
   GdkMacosGLContext *self = (GdkMacosGLContext *)context;
+  const cairo_region_t *damage;
+  GdkMacosBuffer *buffer;
+  GdkSurface *surface;
 
-  if (self->damage)
-    return cairo_region_copy (self->damage);
+  g_assert (GDK_IS_MACOS_GL_CONTEXT (self));
+
+  if ((surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (context))) &&
+      (buffer = GDK_MACOS_SURFACE (surface)->front) &&
+      (damage = _gdk_macos_buffer_get_damage (buffer)))
+    return cairo_region_copy (damage);
 
   return GDK_GL_CONTEXT_CLASS (gdk_macos_gl_context_parent_class)->get_damage (context);
 }
@@ -619,8 +622,6 @@ gdk_macos_gl_context_dispose (GObject *gobject)
       CGLDestroyContext (cgl_context);
     }
 
-  g_clear_pointer (&self->damage, cairo_region_destroy);
-
   G_OBJECT_CLASS (gdk_macos_gl_context_parent_class)->dispose (gobject);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]