summaryrefslogtreecommitdiff
path: root/cogl
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2020-05-22 21:52:29 +0200
committerJonas Ådahl <jadahl@gmail.com>2020-07-02 19:36:50 +0200
commit2a6e8bda8d19c43f40e3cadfa43bfa596a6ca93a (patch)
tree0e8327d3ac1f06f2884a2ae408bdab8f929a6266 /cogl
parent31a3b1b4c54836319fafbdce5c20b5ced8f84450 (diff)
downloadmutter-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.h3
-rw-r--r--cogl/cogl/cogl-frame-info.c2
-rw-r--r--cogl/cogl/cogl-frame-info.h5
-rw-r--r--cogl/cogl/cogl-onscreen.c30
-rw-r--r--cogl/cogl/cogl-onscreen.h14
-rw-r--r--cogl/cogl/meson.build2
-rw-r--r--cogl/cogl/winsys/cogl-winsys-egl.c6
-rw-r--r--cogl/cogl/winsys/cogl-winsys-glx.c6
-rw-r--r--cogl/cogl/winsys/cogl-winsys-private.h11
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);