From fe72876b203576619cbafab475f899e662b36bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Mon, 19 Oct 2020 21:47:41 +0200 Subject: [PATCH] cogl/onscreen: Make swap_buffer/region CoglOnscreen class vfuncs No need to go via the "winsys" vtable. Part-of: --- 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 eff4521dd..d61a3a488 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 a815d7cb4..6a134dc90 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 6262c652e..7e4807ed4 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 fab854a69..b464405d2 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 24ee9cddc..882e793d1 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 8b10e3969..e5e9a1f2f 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 8a563aca3..5149b4eb6 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 97d92e0cd..5561b13d2 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 95ff65237..d6a235710 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 e21d90545..5f3a3d982 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 92892d63d..ef0849899 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 eda59a69c..62f780e18 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;