[mutter] cogl/onscreen: Make swap_buffer/region CoglOnscreen class vfuncs



commit fe72876b203576619cbafab475f899e662b36bad
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Mon Oct 19 21:47:41 2020 +0200

    cogl/onscreen: Make swap_buffer/region CoglOnscreen class vfuncs
    
    No need to go via the "winsys" vtable.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1514>

 cogl/cogl/cogl-onscreen.c                  | 29 ++++++++++++++---------------
 cogl/cogl/cogl-onscreen.h                  | 13 +++++++++++++
 cogl/cogl/winsys/cogl-onscreen-egl.c       | 29 +++++++++++++++++------------
 cogl/cogl/winsys/cogl-onscreen-egl.h       | 14 --------------
 cogl/cogl/winsys/cogl-onscreen-glx.c       | 29 +++++++++++++++++------------
 cogl/cogl/winsys/cogl-onscreen-glx.h       | 14 --------------
 cogl/cogl/winsys/cogl-winsys-egl.c         |  3 ---
 cogl/cogl/winsys/cogl-winsys-glx.c         |  3 ---
 cogl/cogl/winsys/cogl-winsys-private.h     | 14 --------------
 src/backends/native/meta-onscreen-native.c | 20 ++++++++++++--------
 src/backends/native/meta-onscreen-native.h |  6 ------
 src/backends/native/meta-renderer-native.c |  4 ----
 12 files changed, 73 insertions(+), 105 deletions(-)
---
diff --git a/cogl/cogl/cogl-onscreen.c b/cogl/cogl/cogl-onscreen.c
index eff4521dd2..d61a3a4886 100644
--- a/cogl/cogl/cogl-onscreen.c
+++ b/cogl/cogl/cogl-onscreen.c
@@ -310,7 +310,7 @@ cogl_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
 {
   CoglOnscreenPrivate *priv = cogl_onscreen_get_instance_private (onscreen);
   CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
-  const CoglWinsysVtable *winsys;
+  CoglOnscreenClass *klass = COGL_ONSCREEN_GET_CLASS (onscreen);
 
   g_return_if_fail  (COGL_IS_ONSCREEN (framebuffer));
 
@@ -322,11 +322,12 @@ cogl_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
   if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_SYNC_FRAME)))
     cogl_framebuffer_finish (framebuffer);
 
-  winsys = _cogl_framebuffer_get_winsys (framebuffer);
-  winsys->onscreen_swap_buffers_with_damage (onscreen,
-                                             rectangles, n_rectangles,
-                                             info,
-                                             user_data);
+  klass->swap_buffers_with_damage (onscreen,
+                                   rectangles,
+                                   n_rectangles,
+                                   info,
+                                   user_data);
+
   cogl_framebuffer_discard_buffers (framebuffer,
                                     COGL_BUFFER_BIT_COLOR |
                                     COGL_BUFFER_BIT_DEPTH |
@@ -366,7 +367,7 @@ cogl_onscreen_swap_region (CoglOnscreen *onscreen,
 {
   CoglOnscreenPrivate *priv = cogl_onscreen_get_instance_private (onscreen);
   CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
-  const CoglWinsysVtable *winsys;
+  CoglOnscreenClass *klass = COGL_ONSCREEN_GET_CLASS (onscreen);
 
   g_return_if_fail  (COGL_IS_ONSCREEN (framebuffer));
 
@@ -378,17 +379,15 @@ cogl_onscreen_swap_region (CoglOnscreen *onscreen,
   if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_SYNC_FRAME)))
     cogl_framebuffer_finish (framebuffer);
 
-  winsys = _cogl_framebuffer_get_winsys (framebuffer);
-
   /* This should only be called if the winsys advertises
      COGL_WINSYS_FEATURE_SWAP_REGION */
-  g_return_if_fail (winsys->onscreen_swap_region != NULL);
+  g_return_if_fail (klass->swap_region);
 
-  winsys->onscreen_swap_region (COGL_ONSCREEN (framebuffer),
-                                rectangles,
-                                n_rectangles,
-                                info,
-                                user_data);
+  klass->swap_region (onscreen,
+                      rectangles,
+                      n_rectangles,
+                      info,
+                      user_data);
 
   cogl_framebuffer_discard_buffers (framebuffer,
                                     COGL_BUFFER_BIT_COLOR |
diff --git a/cogl/cogl/cogl-onscreen.h b/cogl/cogl/cogl-onscreen.h
index a815d7cb40..6a134dc90c 100644
--- a/cogl/cogl/cogl-onscreen.h
+++ b/cogl/cogl/cogl-onscreen.h
@@ -57,6 +57,19 @@ struct _CoglOnscreenClass
 {
   /*< private >*/
   CoglFramebufferClass parent_class;
+
+  void (* swap_buffers_with_damage) (CoglOnscreen  *onscreen,
+                                     const int     *rectangles,
+                                     int            n_rectangles,
+                                     CoglFrameInfo *info,
+                                     gpointer       user_data);
+
+  void (* swap_region) (CoglOnscreen  *onscreen,
+                        const int     *rectangles,
+                        int            n_rectangles,
+                        CoglFrameInfo *info,
+                        gpointer       user_data);
+
 };
 
 #define COGL_SCANOUT_ERROR (cogl_scanout_error_quark ())
diff --git a/cogl/cogl/winsys/cogl-onscreen-egl.c b/cogl/cogl/winsys/cogl-onscreen-egl.c
index 6262c652e3..7e4807ed45 100644
--- a/cogl/cogl/winsys/cogl-onscreen-egl.c
+++ b/cogl/cogl/winsys/cogl-onscreen-egl.c
@@ -208,12 +208,12 @@ _cogl_winsys_onscreen_egl_get_buffer_age (CoglOnscreen *onscreen)
   return age;
 }
 
-void
-_cogl_winsys_onscreen_egl_swap_region (CoglOnscreen  *onscreen,
-                                       const int     *user_rectangles,
-                                       int            n_rectangles,
-                                       CoglFrameInfo *info,
-                                       gpointer       user_data)
+static void
+cogl_onscreen_egl_swap_region (CoglOnscreen  *onscreen,
+                               const int     *user_rectangles,
+                               int            n_rectangles,
+                               CoglFrameInfo *info,
+                               gpointer       user_data)
 {
   CoglOnscreenEgl *onscreen_egl = COGL_ONSCREEN_EGL (onscreen);
   CoglOnscreenEglPrivate *priv =
@@ -252,12 +252,12 @@ _cogl_winsys_onscreen_egl_swap_region (CoglOnscreen  *onscreen,
     g_warning ("Error reported by eglSwapBuffersRegion");
 }
 
-void
-_cogl_winsys_onscreen_egl_swap_buffers_with_damage (CoglOnscreen  *onscreen,
-                                                    const int     *rectangles,
-                                                    int            n_rectangles,
-                                                    CoglFrameInfo *info,
-                                                    gpointer       user_data)
+static void
+cogl_onscreen_egl_swap_buffers_with_damage (CoglOnscreen  *onscreen,
+                                            const int     *rectangles,
+                                            int            n_rectangles,
+                                            CoglFrameInfo *info,
+                                            gpointer       user_data)
 {
   CoglOnscreenEgl *onscreen_egl = COGL_ONSCREEN_EGL (onscreen);
   CoglOnscreenEglPrivate *priv =
@@ -354,6 +354,11 @@ static void
 cogl_onscreen_egl_class_init (CoglOnscreenEglClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  CoglOnscreenClass *onscreen_class = COGL_ONSCREEN_CLASS (klass);
 
   object_class->dispose = cogl_onscreen_egl_dispose;
+
+  onscreen_class->swap_buffers_with_damage =
+    cogl_onscreen_egl_swap_buffers_with_damage;
+  onscreen_class->swap_region = cogl_onscreen_egl_swap_region;
 }
diff --git a/cogl/cogl/winsys/cogl-onscreen-egl.h b/cogl/cogl/winsys/cogl-onscreen-egl.h
index fab854a693..b464405d28 100644
--- a/cogl/cogl/winsys/cogl-onscreen-egl.h
+++ b/cogl/cogl/winsys/cogl-onscreen-egl.h
@@ -47,20 +47,6 @@ _cogl_winsys_onscreen_egl_bind (CoglOnscreen *onscreen);
 int
 _cogl_winsys_onscreen_egl_get_buffer_age (CoglOnscreen *onscreen);
 
-void
-_cogl_winsys_onscreen_egl_swap_region (CoglOnscreen  *onscreen,
-                                       const int     *user_rectangles,
-                                       int            n_rectangles,
-                                       CoglFrameInfo *info,
-                                       gpointer       user_data);
-
-void
-_cogl_winsys_onscreen_egl_swap_buffers_with_damage (CoglOnscreen  *onscreen,
-                                                    const int     *rectangles,
-                                                    int            n_rectangles,
-                                                    CoglFrameInfo *info,
-                                                    gpointer       user_data);
-
 COGL_EXPORT void
 cogl_onscreen_egl_set_platform (CoglOnscreenEgl *onscreen_egl,
                                 gpointer         platform);
diff --git a/cogl/cogl/winsys/cogl-onscreen-glx.c b/cogl/cogl/winsys/cogl-onscreen-glx.c
index 24ee9cddcb..882e793d1e 100644
--- a/cogl/cogl/winsys/cogl-onscreen-glx.c
+++ b/cogl/cogl/winsys/cogl-onscreen-glx.c
@@ -661,12 +661,12 @@ set_complete_pending (CoglOnscreen *onscreen)
   onscreen_glx->pending_complete_notify++;
 }
 
-void
-_cogl_winsys_onscreen_glx_swap_region (CoglOnscreen  *onscreen,
-                                       const int     *user_rectangles,
-                                       int            n_rectangles,
-                                       CoglFrameInfo *info,
-                                       gpointer       user_data)
+static void
+cogl_onscreen_glx_swap_region (CoglOnscreen  *onscreen,
+                               const int     *user_rectangles,
+                               int            n_rectangles,
+                               CoglFrameInfo *info,
+                               gpointer       user_data)
 {
   CoglOnscreenGlx *onscreen_glx = COGL_ONSCREEN_GLX (onscreen);
   CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
@@ -871,12 +871,12 @@ _cogl_winsys_onscreen_glx_swap_region (CoglOnscreen  *onscreen,
     }
 }
 
-void
-_cogl_winsys_onscreen_glx_swap_buffers_with_damage (CoglOnscreen  *onscreen,
-                                                    const int     *rectangles,
-                                                    int            n_rectangles,
-                                                    CoglFrameInfo *info,
-                                                    gpointer       user_data)
+static void
+cogl_onscreen_glx_swap_buffers_with_damage (CoglOnscreen  *onscreen,
+                                            const int     *rectangles,
+                                            int            n_rectangles,
+                                            CoglFrameInfo *info,
+                                            gpointer       user_data)
 {
   CoglOnscreenGlx *onscreen_glx = COGL_ONSCREEN_GLX (onscreen);
   CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
@@ -1154,8 +1154,13 @@ cogl_onscreen_glx_class_init (CoglOnscreenGlxClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   CoglFramebufferClass *framebuffer_class = COGL_FRAMEBUFFER_CLASS (klass);
+  CoglOnscreenClass *onscreen_class = COGL_ONSCREEN_CLASS (klass);
 
   object_class->dispose = cogl_onscreen_glx_dispose;
 
   framebuffer_class->allocate = cogl_onscreen_glx_allocate;
+
+  onscreen_class->swap_buffers_with_damage =
+    cogl_onscreen_glx_swap_buffers_with_damage;
+  onscreen_class->swap_region = cogl_onscreen_glx_swap_region;
 }
diff --git a/cogl/cogl/winsys/cogl-onscreen-glx.h b/cogl/cogl/winsys/cogl-onscreen-glx.h
index 8b10e39692..e5e9a1f2fc 100644
--- a/cogl/cogl/winsys/cogl-onscreen-glx.h
+++ b/cogl/cogl/winsys/cogl-onscreen-glx.h
@@ -47,20 +47,6 @@ _cogl_winsys_onscreen_glx_bind (CoglOnscreen *onscreen);
 int
 _cogl_winsys_onscreen_glx_get_buffer_age (CoglOnscreen *onscreen);
 
-void
-_cogl_winsys_onscreen_glx_swap_region (CoglOnscreen  *onscreen,
-                                       const int     *user_rectangles,
-                                       int            n_rectangles,
-                                       CoglFrameInfo *info,
-                                       gpointer       user_data);
-
-void
-_cogl_winsys_onscreen_glx_swap_buffers_with_damage (CoglOnscreen  *onscreen,
-                                                    const int     *rectangles,
-                                                    int            n_rectangles,
-                                                    CoglFrameInfo *info,
-                                                    gpointer       user_data);
-
 uint32_t
 _cogl_winsys_onscreen_glx_get_window_xid (CoglOnscreen *onscreen);
 
diff --git a/cogl/cogl/winsys/cogl-winsys-egl.c b/cogl/cogl/winsys/cogl-winsys-egl.c
index 8a563aca35..5149b4eb63 100644
--- a/cogl/cogl/winsys/cogl-winsys-egl.c
+++ b/cogl/cogl/winsys/cogl-winsys-egl.c
@@ -637,9 +637,6 @@ static CoglWinsysVtable _cogl_winsys_vtable =
     .context_init = _cogl_winsys_context_init,
     .context_deinit = _cogl_winsys_context_deinit,
     .onscreen_bind = _cogl_winsys_onscreen_egl_bind,
-    .onscreen_swap_buffers_with_damage =
-      _cogl_winsys_onscreen_egl_swap_buffers_with_damage,
-    .onscreen_swap_region = _cogl_winsys_onscreen_egl_swap_region,
     .onscreen_get_buffer_age = _cogl_winsys_onscreen_egl_get_buffer_age,
 
 #if defined(EGL_KHR_fence_sync) || defined(EGL_KHR_reusable_sync)
diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c
index 97d92e0cdd..5561b13d2e 100644
--- a/cogl/cogl/winsys/cogl-winsys-glx.c
+++ b/cogl/cogl/winsys/cogl-winsys-glx.c
@@ -1470,9 +1470,6 @@ static CoglWinsysVtable _cogl_winsys_vtable =
     .context_deinit = _cogl_winsys_context_deinit,
     .context_get_clock_time = _cogl_winsys_get_clock_time,
     .onscreen_bind = _cogl_winsys_onscreen_glx_bind,
-    .onscreen_swap_buffers_with_damage =
-      _cogl_winsys_onscreen_glx_swap_buffers_with_damage,
-    .onscreen_swap_region = _cogl_winsys_onscreen_glx_swap_region,
     .onscreen_get_buffer_age = _cogl_winsys_onscreen_glx_get_buffer_age,
     .onscreen_x11_get_window_xid =
       _cogl_winsys_onscreen_glx_get_window_xid,
diff --git a/cogl/cogl/winsys/cogl-winsys-private.h b/cogl/cogl/winsys/cogl-winsys-private.h
index 95ff65237b..d6a235710c 100644
--- a/cogl/cogl/winsys/cogl-winsys-private.h
+++ b/cogl/cogl/winsys/cogl-winsys-private.h
@@ -107,13 +107,6 @@ typedef struct _CoglWinsysVtable
   void
   (*onscreen_bind) (CoglOnscreen *onscreen);
 
-  void
-  (*onscreen_swap_buffers_with_damage) (CoglOnscreen *onscreen,
-                                        const int *rectangles,
-                                        int n_rectangles,
-                                        CoglFrameInfo *info,
-                                        gpointer user_data);
-
   gboolean
   (*onscreen_direct_scanout) (CoglOnscreen   *onscreen,
                               CoglScanout    *scanout,
@@ -130,13 +123,6 @@ typedef struct _CoglWinsysVtable
   int64_t
   (*context_get_clock_time) (CoglContext *context);
 
-  void
-  (*onscreen_swap_region) (CoglOnscreen *onscreen,
-                           const int *rectangles,
-                           int n_rectangles,
-                           CoglFrameInfo *info,
-                           gpointer user_data);
-
   void
   (*onscreen_set_resizable) (CoglOnscreen *onscreen, gboolean resizable);
 
diff --git a/src/backends/native/meta-onscreen-native.c b/src/backends/native/meta-onscreen-native.c
index e21d905450..5f3a3d9824 100644
--- a/src/backends/native/meta-onscreen-native.c
+++ b/src/backends/native/meta-onscreen-native.c
@@ -955,7 +955,7 @@ ensure_crtc_modes (CoglOnscreen *onscreen)
     meta_onscreen_native_set_crtc_mode (onscreen, renderer_gpu_data);
 }
 
-void
+static void
 meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen  *onscreen,
                                                const int     *rectangles,
                                                int            n_rectangles,
@@ -979,7 +979,7 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen  *onscreen,
   MetaGpuKms *render_gpu = onscreen_native->render_gpu;
   MetaKmsDevice *render_kms_device = meta_gpu_kms_get_kms_device (render_gpu);
   ClutterFrame *frame = user_data;
-  const CoglWinsysVtable *parent_vtable;
+  CoglOnscreenClass *parent_class;
   gboolean egl_context_changed = FALSE;
   gboolean use_modifiers;
   MetaPowerSave power_save_mode;
@@ -996,12 +996,12 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen  *onscreen,
 
   update_secondary_gpu_state_pre_swap_buffers (onscreen);
 
-  parent_vtable = meta_get_renderer_native_parent_vtable ();
-  parent_vtable->onscreen_swap_buffers_with_damage (onscreen,
-                                                    rectangles,
-                                                    n_rectangles,
-                                                    frame_info,
-                                                    user_data);
+  parent_class = COGL_ONSCREEN_CLASS (meta_onscreen_native_parent_class);
+  parent_class->swap_buffers_with_damage (onscreen,
+                                          rectangles,
+                                          n_rectangles,
+                                          frame_info,
+                                          user_data);
 
   renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
                                                          render_gpu);
@@ -2104,8 +2104,12 @@ meta_onscreen_native_class_init (MetaOnscreenNativeClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   CoglFramebufferClass *framebuffer_class = COGL_FRAMEBUFFER_CLASS (klass);
+  CoglOnscreenClass *onscreen_class = COGL_ONSCREEN_CLASS (klass);
 
   object_class->dispose = meta_onscreen_native_dispose;
 
   framebuffer_class->allocate = meta_onscreen_native_allocate;
+
+  onscreen_class->swap_buffers_with_damage =
+    meta_onscreen_native_swap_buffers_with_damage;
 }
diff --git a/src/backends/native/meta-onscreen-native.h b/src/backends/native/meta-onscreen-native.h
index 92892d63dc..ef0849899a 100644
--- a/src/backends/native/meta-onscreen-native.h
+++ b/src/backends/native/meta-onscreen-native.h
@@ -35,12 +35,6 @@ G_DECLARE_FINAL_TYPE (MetaOnscreenNative, meta_onscreen_native,
 
 void meta_renderer_native_release_onscreen (CoglOnscreen *onscreen);
 
-void meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen  *onscreen,
-                                                    const int     *rectangles,
-                                                    int            n_rectangles,
-                                                    CoglFrameInfo *frame_info,
-                                                    gpointer       user_data);
-
 gboolean meta_onscreen_native_direct_scanout (CoglOnscreen   *onscreen,
                                               CoglScanout    *scanout,
                                               CoglFrameInfo  *frame_info,
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index eda59a69cc..62f780e182 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -940,10 +940,6 @@ get_native_cogl_winsys_vtable (CoglRenderer *cogl_renderer)
       vtable.renderer_disconnect = meta_renderer_native_disconnect;
       vtable.renderer_create_dma_buf = meta_renderer_native_create_dma_buf;
 
-      /* The KMS winsys doesn't support swap region */
-      vtable.onscreen_swap_region = NULL;
-      vtable.onscreen_swap_buffers_with_damage =
-        meta_onscreen_native_swap_buffers_with_damage;
       vtable.onscreen_direct_scanout = meta_onscreen_native_direct_scanout;
 
       vtable.context_get_clock_time = meta_renderer_native_get_clock_time;


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