clutter/frame-clock: Pass ClutterFrame via the frame clock interface
Let the ClutterFrame live for the whole frame, and be carried as an argument to the frame clock listener interface functions. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2795>
This commit is contained in:
parent
1c574068e0
commit
916b21674e
@ -20,6 +20,7 @@
|
|||||||
#include "clutter/clutter-frame-clock.h"
|
#include "clutter/clutter-frame-clock.h"
|
||||||
|
|
||||||
#include "clutter/clutter-debug.h"
|
#include "clutter/clutter-debug.h"
|
||||||
|
#include "clutter/clutter-frame-private.h"
|
||||||
#include "clutter/clutter-main.h"
|
#include "clutter/clutter-main.h"
|
||||||
#include "clutter/clutter-private.h"
|
#include "clutter/clutter-private.h"
|
||||||
#include "clutter/clutter-timeline-private.h"
|
#include "clutter/clutter-timeline-private.h"
|
||||||
@ -691,6 +692,7 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock,
|
|||||||
int64_t time_us)
|
int64_t time_us)
|
||||||
{
|
{
|
||||||
const ClutterFrameListenerIface *iface = frame_clock->listener.iface;
|
const ClutterFrameListenerIface *iface = frame_clock->listener.iface;
|
||||||
|
g_autoptr (ClutterFrame) frame = NULL;
|
||||||
int64_t frame_count;
|
int64_t frame_count;
|
||||||
ClutterFrameResult result;
|
ClutterFrameResult result;
|
||||||
int64_t ideal_dispatch_time_us, lateness_us;
|
int64_t ideal_dispatch_time_us, lateness_us;
|
||||||
@ -729,13 +731,12 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock,
|
|||||||
|
|
||||||
frame_count = frame_clock->frame_count++;
|
frame_count = frame_clock->frame_count++;
|
||||||
|
|
||||||
|
frame = g_new0 (ClutterFrame, 1);
|
||||||
|
frame->frame_count = frame_count;
|
||||||
|
|
||||||
COGL_TRACE_BEGIN (ClutterFrameClockEvents, "Frame Clock (before frame)");
|
COGL_TRACE_BEGIN (ClutterFrameClockEvents, "Frame Clock (before frame)");
|
||||||
if (iface->before_frame)
|
if (iface->before_frame)
|
||||||
{
|
iface->before_frame (frame_clock, frame, frame_clock->listener.user_data);
|
||||||
iface->before_frame (frame_clock,
|
|
||||||
frame_count,
|
|
||||||
frame_clock->listener.user_data);
|
|
||||||
}
|
|
||||||
COGL_TRACE_END (ClutterFrameClockEvents);
|
COGL_TRACE_END (ClutterFrameClockEvents);
|
||||||
|
|
||||||
COGL_TRACE_BEGIN (ClutterFrameClockTimelines, "Frame Clock (timelines)");
|
COGL_TRACE_BEGIN (ClutterFrameClockTimelines, "Frame Clock (timelines)");
|
||||||
@ -745,9 +746,7 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock,
|
|||||||
COGL_TRACE_END (ClutterFrameClockTimelines);
|
COGL_TRACE_END (ClutterFrameClockTimelines);
|
||||||
|
|
||||||
COGL_TRACE_BEGIN (ClutterFrameClockFrame, "Frame Clock (frame)");
|
COGL_TRACE_BEGIN (ClutterFrameClockFrame, "Frame Clock (frame)");
|
||||||
result = iface->frame (frame_clock,
|
result = iface->frame (frame_clock, frame, frame_clock->listener.user_data);
|
||||||
frame_count,
|
|
||||||
frame_clock->listener.user_data);
|
|
||||||
COGL_TRACE_END (ClutterFrameClockFrame);
|
COGL_TRACE_END (ClutterFrameClockFrame);
|
||||||
|
|
||||||
switch (frame_clock->state)
|
switch (frame_clock->state)
|
||||||
|
@ -46,10 +46,10 @@ G_DECLARE_FINAL_TYPE (ClutterFrameClock, clutter_frame_clock,
|
|||||||
typedef struct _ClutterFrameListenerIface
|
typedef struct _ClutterFrameListenerIface
|
||||||
{
|
{
|
||||||
void (* before_frame) (ClutterFrameClock *frame_clock,
|
void (* before_frame) (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
ClutterFrameResult (* frame) (ClutterFrameClock *frame_clock,
|
ClutterFrameResult (* frame) (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
} ClutterFrameListenerIface;
|
} ClutterFrameListenerIface;
|
||||||
|
|
||||||
|
@ -22,12 +22,12 @@
|
|||||||
|
|
||||||
struct _ClutterFrame
|
struct _ClutterFrame
|
||||||
{
|
{
|
||||||
|
int64_t frame_count;
|
||||||
|
|
||||||
gboolean has_result;
|
gboolean has_result;
|
||||||
ClutterFrameResult result;
|
ClutterFrameResult result;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CLUTTER_FRAME_INIT ((ClutterFrame) { 0 })
|
|
||||||
|
|
||||||
ClutterFrameResult clutter_frame_get_result (ClutterFrame *frame);
|
ClutterFrameResult clutter_frame_get_result (ClutterFrame *frame);
|
||||||
|
|
||||||
#endif /* CLUTTER_FRAME_PRIVATE_H */
|
#endif /* CLUTTER_FRAME_PRIVATE_H */
|
||||||
|
@ -17,6 +17,12 @@
|
|||||||
|
|
||||||
#include "clutter/clutter-frame-private.h"
|
#include "clutter/clutter-frame-private.h"
|
||||||
|
|
||||||
|
int64_t
|
||||||
|
clutter_frame_get_count (ClutterFrame *frame)
|
||||||
|
{
|
||||||
|
return frame->frame_count;
|
||||||
|
}
|
||||||
|
|
||||||
ClutterFrameResult
|
ClutterFrameResult
|
||||||
clutter_frame_get_result (ClutterFrame *frame)
|
clutter_frame_get_result (ClutterFrame *frame)
|
||||||
{
|
{
|
||||||
|
@ -26,6 +26,9 @@
|
|||||||
|
|
||||||
typedef struct _ClutterFrame ClutterFrame;
|
typedef struct _ClutterFrame ClutterFrame;
|
||||||
|
|
||||||
|
CLUTTER_EXPORT
|
||||||
|
int64_t clutter_frame_get_count (ClutterFrame *frame);
|
||||||
|
|
||||||
CLUTTER_EXPORT
|
CLUTTER_EXPORT
|
||||||
void clutter_frame_set_result (ClutterFrame *frame,
|
void clutter_frame_set_result (ClutterFrame *frame,
|
||||||
ClutterFrameResult result);
|
ClutterFrameResult result);
|
||||||
@ -33,4 +36,6 @@ void clutter_frame_set_result (ClutterFrame *frame,
|
|||||||
CLUTTER_EXPORT
|
CLUTTER_EXPORT
|
||||||
gboolean clutter_frame_has_result (ClutterFrame *frame);
|
gboolean clutter_frame_has_result (ClutterFrame *frame);
|
||||||
|
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterFrame, g_free)
|
||||||
|
|
||||||
#endif /* CLUTTER_FRAME_H */
|
#endif /* CLUTTER_FRAME_H */
|
||||||
|
@ -1131,7 +1131,7 @@ clutter_stage_view_has_shadowfb (ClutterStageView *view)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
handle_frame_clock_before_frame (ClutterFrameClock *frame_clock,
|
handle_frame_clock_before_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
ClutterStageView *view = user_data;
|
ClutterStageView *view = user_data;
|
||||||
@ -1207,7 +1207,7 @@ end_frame_timing_measurement (ClutterStageView *view)
|
|||||||
|
|
||||||
static ClutterFrameResult
|
static ClutterFrameResult
|
||||||
handle_frame_clock_frame (ClutterFrameClock *frame_clock,
|
handle_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
ClutterStageView *view = user_data;
|
ClutterStageView *view = user_data;
|
||||||
@ -1216,7 +1216,6 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock,
|
|||||||
ClutterStage *stage = priv->stage;
|
ClutterStage *stage = priv->stage;
|
||||||
ClutterStageWindow *stage_window = _clutter_stage_get_window (stage);
|
ClutterStageWindow *stage_window = _clutter_stage_get_window (stage);
|
||||||
g_autoptr (GSList) devices = NULL;
|
g_autoptr (GSList) devices = NULL;
|
||||||
ClutterFrame frame;
|
|
||||||
|
|
||||||
if (CLUTTER_ACTOR_IN_DESTRUCTION (stage))
|
if (CLUTTER_ACTOR_IN_DESTRUCTION (stage))
|
||||||
return CLUTTER_FRAME_RESULT_IDLE;
|
return CLUTTER_FRAME_RESULT_IDLE;
|
||||||
@ -1241,16 +1240,14 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock,
|
|||||||
if (priv->needs_update_devices)
|
if (priv->needs_update_devices)
|
||||||
devices = clutter_stage_find_updated_devices (stage, view);
|
devices = clutter_stage_find_updated_devices (stage, view);
|
||||||
|
|
||||||
frame = CLUTTER_FRAME_INIT;
|
_clutter_stage_window_prepare_frame (stage_window, view, frame);
|
||||||
|
|
||||||
_clutter_stage_window_prepare_frame (stage_window, view, &frame);
|
|
||||||
clutter_stage_emit_prepare_frame (stage, view);
|
clutter_stage_emit_prepare_frame (stage, view);
|
||||||
|
|
||||||
if (clutter_stage_view_has_redraw_clip (view))
|
if (clutter_stage_view_has_redraw_clip (view))
|
||||||
{
|
{
|
||||||
clutter_stage_emit_before_paint (stage, view);
|
clutter_stage_emit_before_paint (stage, view);
|
||||||
|
|
||||||
_clutter_stage_window_redraw_view (stage_window, view, &frame);
|
_clutter_stage_window_redraw_view (stage_window, view, frame);
|
||||||
|
|
||||||
clutter_frame_clock_record_flip_time (frame_clock,
|
clutter_frame_clock_record_flip_time (frame_clock,
|
||||||
g_get_monotonic_time ());
|
g_get_monotonic_time ());
|
||||||
@ -1261,7 +1258,7 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock,
|
|||||||
end_frame_timing_measurement (view);
|
end_frame_timing_measurement (view);
|
||||||
}
|
}
|
||||||
|
|
||||||
_clutter_stage_window_finish_frame (stage_window, view, &frame);
|
_clutter_stage_window_finish_frame (stage_window, view, frame);
|
||||||
|
|
||||||
clutter_stage_update_devices (stage, devices);
|
clutter_stage_update_devices (stage, devices);
|
||||||
priv->needs_update_devices = FALSE;
|
priv->needs_update_devices = FALSE;
|
||||||
@ -1269,7 +1266,7 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock,
|
|||||||
_clutter_run_repaint_functions (CLUTTER_REPAINT_FLAGS_POST_PAINT);
|
_clutter_run_repaint_functions (CLUTTER_REPAINT_FLAGS_POST_PAINT);
|
||||||
clutter_stage_emit_after_update (stage, view);
|
clutter_stage_emit_after_update (stage, view);
|
||||||
|
|
||||||
return clutter_frame_get_result (&frame);
|
return clutter_frame_get_result (frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const ClutterFrameListenerIface frame_clock_listener_iface = {
|
static const ClutterFrameListenerIface frame_clock_listener_iface = {
|
||||||
|
@ -6,7 +6,7 @@ static const int64_t refresh_interval_us = G_USEC_PER_SEC / refresh_rate;
|
|||||||
|
|
||||||
static ClutterFrameResult
|
static ClutterFrameResult
|
||||||
timeline_frame_clock_frame (ClutterFrameClock *frame_clock,
|
timeline_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
ClutterFrameInfo frame_info;
|
ClutterFrameInfo frame_info;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "clutter/clutter.h"
|
#include "clutter/clutter.h"
|
||||||
|
#include "clutter/clutter-frame.h"
|
||||||
#include "tests/clutter-test-utils.h"
|
#include "tests/clutter-test-utils.h"
|
||||||
|
|
||||||
static const float refresh_rate = 60.0;
|
static const float refresh_rate = 60.0;
|
||||||
@ -91,13 +92,13 @@ fake_hw_clock_new (ClutterFrameClock *frame_clock,
|
|||||||
|
|
||||||
static ClutterFrameResult
|
static ClutterFrameResult
|
||||||
frame_clock_frame (ClutterFrameClock *frame_clock,
|
frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
FrameClockTest *test = user_data;
|
FrameClockTest *test = user_data;
|
||||||
GMainLoop *main_loop = test->main_loop;
|
GMainLoop *main_loop = test->main_loop;
|
||||||
|
|
||||||
g_assert_cmpint (frame_count, ==, expected_frame_count);
|
g_assert_cmpint (clutter_frame_get_count (frame), ==, expected_frame_count);
|
||||||
|
|
||||||
expected_frame_count++;
|
expected_frame_count++;
|
||||||
|
|
||||||
@ -185,13 +186,13 @@ schedule_update_idle (gpointer user_data)
|
|||||||
|
|
||||||
static ClutterFrameResult
|
static ClutterFrameResult
|
||||||
immediate_frame_clock_frame (ClutterFrameClock *frame_clock,
|
immediate_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GMainLoop *main_loop = user_data;
|
GMainLoop *main_loop = user_data;
|
||||||
ClutterFrameInfo frame_info;
|
ClutterFrameInfo frame_info;
|
||||||
|
|
||||||
g_assert_cmpint (frame_count, ==, expected_frame_count);
|
g_assert_cmpint (clutter_frame_get_count (frame), ==, expected_frame_count);
|
||||||
|
|
||||||
expected_frame_count++;
|
expected_frame_count++;
|
||||||
|
|
||||||
@ -259,13 +260,13 @@ schedule_update_timeout (gpointer user_data)
|
|||||||
|
|
||||||
static ClutterFrameResult
|
static ClutterFrameResult
|
||||||
delayed_damage_frame_clock_frame (ClutterFrameClock *frame_clock,
|
delayed_damage_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
FrameClockTest *test = user_data;
|
FrameClockTest *test = user_data;
|
||||||
GMainLoop *main_loop = test->main_loop;
|
GMainLoop *main_loop = test->main_loop;
|
||||||
|
|
||||||
g_assert_cmpint (frame_count, ==, expected_frame_count);
|
g_assert_cmpint (clutter_frame_get_count (frame), ==, expected_frame_count);
|
||||||
|
|
||||||
expected_frame_count++;
|
expected_frame_count++;
|
||||||
|
|
||||||
@ -332,7 +333,7 @@ frame_clock_delayed_damage (void)
|
|||||||
|
|
||||||
static ClutterFrameResult
|
static ClutterFrameResult
|
||||||
no_damage_frame_clock_frame (ClutterFrameClock *frame_clock,
|
no_damage_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
@ -385,13 +386,13 @@ typedef struct _UpdateNowFrameClockTest
|
|||||||
|
|
||||||
static ClutterFrameResult
|
static ClutterFrameResult
|
||||||
update_now_frame_clock_frame (ClutterFrameClock *frame_clock,
|
update_now_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
UpdateNowFrameClockTest *test = user_data;
|
UpdateNowFrameClockTest *test = user_data;
|
||||||
GMainLoop *main_loop = test->base.main_loop;
|
GMainLoop *main_loop = test->base.main_loop;
|
||||||
|
|
||||||
g_assert_cmpint (frame_count, ==, expected_frame_count);
|
g_assert_cmpint (clutter_frame_get_count (frame), ==, expected_frame_count);
|
||||||
|
|
||||||
expected_frame_count++;
|
expected_frame_count++;
|
||||||
|
|
||||||
@ -481,23 +482,23 @@ frame_clock_schedule_update_now (void)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
before_frame_frame_clock_before_frame (ClutterFrameClock *frame_clock,
|
before_frame_frame_clock_before_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
int64_t *expected_frame_count = user_data;
|
int64_t *expected_frame_count = user_data;
|
||||||
|
|
||||||
g_assert_cmpint (*expected_frame_count, ==, frame_count);
|
g_assert_cmpint (*expected_frame_count, ==, clutter_frame_get_count (frame));
|
||||||
}
|
}
|
||||||
|
|
||||||
static ClutterFrameResult
|
static ClutterFrameResult
|
||||||
before_frame_frame_clock_frame (ClutterFrameClock *frame_clock,
|
before_frame_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
int64_t *expected_frame_count = user_data;
|
int64_t *expected_frame_count = user_data;
|
||||||
ClutterFrameInfo frame_info;
|
ClutterFrameInfo frame_info;
|
||||||
|
|
||||||
g_assert_cmpint (*expected_frame_count, ==, frame_count);
|
g_assert_cmpint (*expected_frame_count, ==, clutter_frame_get_count (frame));
|
||||||
|
|
||||||
(*expected_frame_count)++;
|
(*expected_frame_count)++;
|
||||||
|
|
||||||
@ -560,13 +561,13 @@ typedef struct _InhibitTest
|
|||||||
|
|
||||||
static ClutterFrameResult
|
static ClutterFrameResult
|
||||||
inhibit_frame_clock_frame (ClutterFrameClock *frame_clock,
|
inhibit_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
InhibitTest *test = user_data;
|
InhibitTest *test = user_data;
|
||||||
ClutterFrameInfo frame_info;
|
ClutterFrameInfo frame_info;
|
||||||
|
|
||||||
g_assert_cmpint (frame_count, ==, test->frame_count);
|
g_assert_cmpint (clutter_frame_get_count (frame), ==, test->frame_count);
|
||||||
|
|
||||||
test->frame_count++;
|
test->frame_count++;
|
||||||
|
|
||||||
@ -637,13 +638,13 @@ typedef struct _RescheduleOnIdleFrameClockTest
|
|||||||
|
|
||||||
static ClutterFrameResult
|
static ClutterFrameResult
|
||||||
reschedule_on_idle_clock_frame (ClutterFrameClock *frame_clock,
|
reschedule_on_idle_clock_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
RescheduleOnIdleFrameClockTest *test = user_data;
|
RescheduleOnIdleFrameClockTest *test = user_data;
|
||||||
GMainLoop *main_loop = test->base.main_loop;
|
GMainLoop *main_loop = test->base.main_loop;
|
||||||
|
|
||||||
g_assert_cmpint (frame_count, ==, expected_frame_count);
|
g_assert_cmpint (clutter_frame_get_count (frame), ==, expected_frame_count);
|
||||||
|
|
||||||
expected_frame_count++;
|
expected_frame_count++;
|
||||||
|
|
||||||
@ -764,12 +765,12 @@ notify_ready_and_schedule_update_idle (gpointer user_data)
|
|||||||
|
|
||||||
static ClutterFrameResult
|
static ClutterFrameResult
|
||||||
frame_clock_ready_frame (ClutterFrameClock *frame_clock,
|
frame_clock_ready_frame (ClutterFrameClock *frame_clock,
|
||||||
int64_t frame_count,
|
ClutterFrame *frame,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GMainLoop *main_loop = user_data;
|
GMainLoop *main_loop = user_data;
|
||||||
|
|
||||||
g_assert_cmpint (frame_count, ==, expected_frame_count);
|
g_assert_cmpint (clutter_frame_get_count (frame), ==, expected_frame_count);
|
||||||
|
|
||||||
expected_frame_count++;
|
expected_frame_count++;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user