diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2020-05-22 21:52:29 +0200 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2020-07-02 19:36:50 +0200 |
commit | 2a6e8bda8d19c43f40e3cadfa43bfa596a6ca93a (patch) | |
tree | 0e8327d3ac1f06f2884a2ae408bdab8f929a6266 /cogl | |
parent | 31a3b1b4c54836319fafbdce5c20b5ced8f84450 (diff) | |
download | mutter-2a6e8bda8d19c43f40e3cadfa43bfa596a6ca93a.tar.gz |
cogl/onscreen: Let swap buffer caller create frame info
We currently have mutter set a global frame counter on the frame info in
the native backend, but in order to do this from clutter, change the
frame info construction from being implicitly done so when swapping
buffers to having the caller create the frame info and passing that to
the swap buffers call.
While this commit doesn't introduce any other changes than the API, the
intention is later to have the caller be able to pass it's own state
(e.g. the global frame count) along with the frame info.
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1285
Diffstat (limited to 'cogl')
-rw-r--r-- | cogl/cogl/cogl-frame-info-private.h | 3 | ||||
-rw-r--r-- | cogl/cogl/cogl-frame-info.c | 2 | ||||
-rw-r--r-- | cogl/cogl/cogl-frame-info.h | 5 | ||||
-rw-r--r-- | cogl/cogl/cogl-onscreen.c | 30 | ||||
-rw-r--r-- | cogl/cogl/cogl-onscreen.h | 14 | ||||
-rw-r--r-- | cogl/cogl/meson.build | 2 | ||||
-rw-r--r-- | cogl/cogl/winsys/cogl-winsys-egl.c | 6 | ||||
-rw-r--r-- | cogl/cogl/winsys/cogl-winsys-glx.c | 6 | ||||
-rw-r--r-- | cogl/cogl/winsys/cogl-winsys-private.h | 11 |
9 files changed, 48 insertions, 31 deletions
diff --git a/cogl/cogl/cogl-frame-info-private.h b/cogl/cogl/cogl-frame-info-private.h index f0324f251..585e2c2e7 100644 --- a/cogl/cogl/cogl-frame-info-private.h +++ b/cogl/cogl/cogl-frame-info-private.h @@ -45,6 +45,7 @@ struct _CoglFrameInfo int64_t global_frame_counter; }; -CoglFrameInfo *_cogl_frame_info_new (void); +COGL_EXPORT +CoglFrameInfo *cogl_frame_info_new (void); #endif /* __COGL_FRAME_INFO_PRIVATE_H */ diff --git a/cogl/cogl/cogl-frame-info.c b/cogl/cogl/cogl-frame-info.c index 1071495a0..a6e9f3260 100644 --- a/cogl/cogl/cogl-frame-info.c +++ b/cogl/cogl/cogl-frame-info.c @@ -39,7 +39,7 @@ COGL_OBJECT_DEFINE (FrameInfo, frame_info); COGL_GTYPE_DEFINE_CLASS (FrameInfo, frame_info); CoglFrameInfo * -_cogl_frame_info_new (void) +cogl_frame_info_new (void) { CoglFrameInfo *info; diff --git a/cogl/cogl/cogl-frame-info.h b/cogl/cogl/cogl-frame-info.h index 8acbb34bd..2204bafdb 100644 --- a/cogl/cogl/cogl-frame-info.h +++ b/cogl/cogl/cogl-frame-info.h @@ -45,6 +45,11 @@ G_BEGIN_DECLS +/** + * CoglFrameInfo: + * + * Frame information. + */ typedef struct _CoglFrameInfo CoglFrameInfo; #define COGL_FRAME_INFO(X) ((CoglFrameInfo *)(X)) diff --git a/cogl/cogl/cogl-onscreen.c b/cogl/cogl/cogl-onscreen.c index 892a0af3b..a3c1514a5 100644 --- a/cogl/cogl/cogl-onscreen.c +++ b/cogl/cogl/cogl-onscreen.c @@ -293,15 +293,14 @@ _cogl_onscreen_queue_event (CoglOnscreen *onscreen, void cogl_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen, const int *rectangles, - int n_rectangles) + int n_rectangles, + CoglFrameInfo *info) { CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); const CoglWinsysVtable *winsys; - CoglFrameInfo *info; g_return_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN); - info = _cogl_frame_info_new (); info->frame_counter = onscreen->frame_counter; g_queue_push_tail (&onscreen->pending_frame_infos, info); @@ -310,7 +309,8 @@ cogl_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen, winsys = _cogl_framebuffer_get_winsys (framebuffer); winsys->onscreen_swap_buffers_with_damage (onscreen, - rectangles, n_rectangles); + rectangles, n_rectangles, + info); cogl_framebuffer_discard_buffers (framebuffer, COGL_BUFFER_BIT_COLOR | COGL_BUFFER_BIT_DEPTH | @@ -334,23 +334,23 @@ cogl_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen, } void -cogl_onscreen_swap_buffers (CoglOnscreen *onscreen) +cogl_onscreen_swap_buffers (CoglOnscreen *onscreen, + CoglFrameInfo *info) { - cogl_onscreen_swap_buffers_with_damage (onscreen, NULL, 0); + cogl_onscreen_swap_buffers_with_damage (onscreen, NULL, 0, info); } void cogl_onscreen_swap_region (CoglOnscreen *onscreen, const int *rectangles, - int n_rectangles) + int n_rectangles, + CoglFrameInfo *info) { CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); const CoglWinsysVtable *winsys; - CoglFrameInfo *info; g_return_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN); - info = _cogl_frame_info_new (); info->frame_counter = onscreen->frame_counter; g_queue_push_tail (&onscreen->pending_frame_infos, info); @@ -365,7 +365,8 @@ cogl_onscreen_swap_region (CoglOnscreen *onscreen, winsys->onscreen_swap_region (COGL_ONSCREEN (framebuffer), rectangles, - n_rectangles); + n_rectangles, + info); cogl_framebuffer_discard_buffers (framebuffer, COGL_BUFFER_BIT_COLOR | @@ -406,22 +407,21 @@ cogl_onscreen_get_buffer_age (CoglOnscreen *onscreen) } void -cogl_onscreen_direct_scanout (CoglOnscreen *onscreen, - CoglScanout *scanout) +cogl_onscreen_direct_scanout (CoglOnscreen *onscreen, + CoglScanout *scanout, + CoglFrameInfo *info) { CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); const CoglWinsysVtable *winsys; - CoglFrameInfo *info; g_return_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN); g_return_if_fail (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT)); - info = _cogl_frame_info_new (); info->frame_counter = onscreen->frame_counter; g_queue_push_tail (&onscreen->pending_frame_infos, info); winsys = _cogl_framebuffer_get_winsys (framebuffer); - winsys->onscreen_direct_scanout (onscreen, scanout); + winsys->onscreen_direct_scanout (onscreen, scanout, info); onscreen->frame_counter++; } diff --git a/cogl/cogl/cogl-onscreen.h b/cogl/cogl/cogl-onscreen.h index 845470350..e70d3f806 100644 --- a/cogl/cogl/cogl-onscreen.h +++ b/cogl/cogl/cogl-onscreen.h @@ -178,7 +178,8 @@ cogl_onscreen_hide (CoglOnscreen *onscreen); * Stability: unstable */ COGL_EXPORT void -cogl_onscreen_swap_buffers (CoglOnscreen *onscreen); +cogl_onscreen_swap_buffers (CoglOnscreen *onscreen, + CoglFrameInfo *frame_info); /** @@ -284,14 +285,16 @@ cogl_onscreen_get_buffer_age (CoglOnscreen *onscreen); COGL_EXPORT void cogl_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen, const int *rectangles, - int n_rectangles); + int n_rectangles, + CoglFrameInfo *info); /** * cogl_onscreen_direct_scanout: (skip) */ COGL_EXPORT void -cogl_onscreen_direct_scanout (CoglOnscreen *onscreen, - CoglScanout *scanout); +cogl_onscreen_direct_scanout (CoglOnscreen *onscreen, + CoglScanout *scanout, + CoglFrameInfo *info); /** * cogl_onscreen_swap_region: @@ -316,7 +319,8 @@ cogl_onscreen_direct_scanout (CoglOnscreen *onscreen, COGL_EXPORT void cogl_onscreen_swap_region (CoglOnscreen *onscreen, const int *rectangles, - int n_rectangles); + int n_rectangles, + CoglFrameInfo *info); /** * CoglFrameEvent: diff --git a/cogl/cogl/meson.build b/cogl/cogl/meson.build index edcac793e..2947b46c9 100644 --- a/cogl/cogl/meson.build +++ b/cogl/cogl/meson.build @@ -77,6 +77,7 @@ cogl_headers = [ 'cogl-bitmap.h', 'cogl-color.h', 'cogl-context.h', + 'cogl-frame-info.h', 'cogl-framebuffer.h', 'cogl-matrix.h', 'cogl-object.h', @@ -106,7 +107,6 @@ cogl_nonintrospected_headers = [ 'cogl-indices.h', 'cogl-attribute.h', 'cogl-primitive.h', - 'cogl-frame-info.h', 'cogl-output.h', 'cogl-matrix-stack.h', 'cogl-poll.h', diff --git a/cogl/cogl/winsys/cogl-winsys-egl.c b/cogl/cogl/winsys/cogl-winsys-egl.c index 5dd106d1b..8c999c52b 100644 --- a/cogl/cogl/winsys/cogl-winsys-egl.c +++ b/cogl/cogl/winsys/cogl-winsys-egl.c @@ -726,7 +726,8 @@ _cogl_winsys_onscreen_get_buffer_age (CoglOnscreen *onscreen) static void _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen, const int *user_rectangles, - int n_rectangles) + int n_rectangles, + CoglFrameInfo *info) { CoglContext *context = COGL_FRAMEBUFFER (onscreen)->context; CoglRenderer *renderer = context->display->renderer; @@ -765,7 +766,8 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen, static void _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen, const int *rectangles, - int n_rectangles) + int n_rectangles, + CoglFrameInfo *info) { CoglContext *context = COGL_FRAMEBUFFER (onscreen)->context; CoglRenderer *renderer = context->display->renderer; diff --git a/cogl/cogl/winsys/cogl-winsys-glx.c b/cogl/cogl/winsys/cogl-winsys-glx.c index 86d5acd05..0b1c1eac2 100644 --- a/cogl/cogl/winsys/cogl-winsys-glx.c +++ b/cogl/cogl/winsys/cogl-winsys-glx.c @@ -1673,7 +1673,8 @@ set_frame_info_output (CoglOnscreen *onscreen, static void _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen, const int *user_rectangles, - int n_rectangles) + int n_rectangles, + CoglFrameInfo *info) { CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglContext *context = framebuffer->context; @@ -1879,7 +1880,8 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen, static void _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen, const int *rectangles, - int n_rectangles) + int n_rectangles, + CoglFrameInfo *info) { CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglContext *context = framebuffer->context; diff --git a/cogl/cogl/winsys/cogl-winsys-private.h b/cogl/cogl/winsys/cogl-winsys-private.h index 01a45b765..b9dbff524 100644 --- a/cogl/cogl/winsys/cogl-winsys-private.h +++ b/cogl/cogl/winsys/cogl-winsys-private.h @@ -116,11 +116,13 @@ typedef struct _CoglWinsysVtable void (*onscreen_swap_buffers_with_damage) (CoglOnscreen *onscreen, const int *rectangles, - int n_rectangles); + int n_rectangles, + CoglFrameInfo *info); void - (*onscreen_direct_scanout) (CoglOnscreen *onscreen, - CoglScanout *scanout); + (*onscreen_direct_scanout) (CoglOnscreen *onscreen, + CoglScanout *scanout, + CoglFrameInfo *info); void (*onscreen_set_visibility) (CoglOnscreen *onscreen, @@ -134,7 +136,8 @@ typedef struct _CoglWinsysVtable void (*onscreen_swap_region) (CoglOnscreen *onscreen, const int *rectangles, - int n_rectangles); + int n_rectangles, + CoglFrameInfo *info); void (*onscreen_set_resizable) (CoglOnscreen *onscreen, gboolean resizable); |