mirror of
https://github.com/brl/mutter.git
synced 2025-06-14 01:09:30 +00:00
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:
@ -20,6 +20,7 @@
|
||||
#include "clutter/clutter-frame-clock.h"
|
||||
|
||||
#include "clutter/clutter-debug.h"
|
||||
#include "clutter/clutter-frame-private.h"
|
||||
#include "clutter/clutter-main.h"
|
||||
#include "clutter/clutter-private.h"
|
||||
#include "clutter/clutter-timeline-private.h"
|
||||
@ -691,6 +692,7 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock,
|
||||
int64_t time_us)
|
||||
{
|
||||
const ClutterFrameListenerIface *iface = frame_clock->listener.iface;
|
||||
g_autoptr (ClutterFrame) frame = NULL;
|
||||
int64_t frame_count;
|
||||
ClutterFrameResult result;
|
||||
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 = g_new0 (ClutterFrame, 1);
|
||||
frame->frame_count = frame_count;
|
||||
|
||||
COGL_TRACE_BEGIN (ClutterFrameClockEvents, "Frame Clock (before frame)");
|
||||
if (iface->before_frame)
|
||||
{
|
||||
iface->before_frame (frame_clock,
|
||||
frame_count,
|
||||
frame_clock->listener.user_data);
|
||||
}
|
||||
iface->before_frame (frame_clock, frame, frame_clock->listener.user_data);
|
||||
COGL_TRACE_END (ClutterFrameClockEvents);
|
||||
|
||||
COGL_TRACE_BEGIN (ClutterFrameClockTimelines, "Frame Clock (timelines)");
|
||||
@ -745,9 +746,7 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock,
|
||||
COGL_TRACE_END (ClutterFrameClockTimelines);
|
||||
|
||||
COGL_TRACE_BEGIN (ClutterFrameClockFrame, "Frame Clock (frame)");
|
||||
result = iface->frame (frame_clock,
|
||||
frame_count,
|
||||
frame_clock->listener.user_data);
|
||||
result = iface->frame (frame_clock, frame, frame_clock->listener.user_data);
|
||||
COGL_TRACE_END (ClutterFrameClockFrame);
|
||||
|
||||
switch (frame_clock->state)
|
||||
|
@ -46,10 +46,10 @@ G_DECLARE_FINAL_TYPE (ClutterFrameClock, clutter_frame_clock,
|
||||
typedef struct _ClutterFrameListenerIface
|
||||
{
|
||||
void (* before_frame) (ClutterFrameClock *frame_clock,
|
||||
int64_t frame_count,
|
||||
ClutterFrame *frame,
|
||||
gpointer user_data);
|
||||
ClutterFrameResult (* frame) (ClutterFrameClock *frame_clock,
|
||||
int64_t frame_count,
|
||||
ClutterFrame *frame,
|
||||
gpointer user_data);
|
||||
} ClutterFrameListenerIface;
|
||||
|
||||
|
@ -22,12 +22,12 @@
|
||||
|
||||
struct _ClutterFrame
|
||||
{
|
||||
int64_t frame_count;
|
||||
|
||||
gboolean has_result;
|
||||
ClutterFrameResult result;
|
||||
};
|
||||
|
||||
#define CLUTTER_FRAME_INIT ((ClutterFrame) { 0 })
|
||||
|
||||
ClutterFrameResult clutter_frame_get_result (ClutterFrame *frame);
|
||||
|
||||
#endif /* CLUTTER_FRAME_PRIVATE_H */
|
||||
|
@ -17,6 +17,12 @@
|
||||
|
||||
#include "clutter/clutter-frame-private.h"
|
||||
|
||||
int64_t
|
||||
clutter_frame_get_count (ClutterFrame *frame)
|
||||
{
|
||||
return frame->frame_count;
|
||||
}
|
||||
|
||||
ClutterFrameResult
|
||||
clutter_frame_get_result (ClutterFrame *frame)
|
||||
{
|
||||
|
@ -26,6 +26,9 @@
|
||||
|
||||
typedef struct _ClutterFrame ClutterFrame;
|
||||
|
||||
CLUTTER_EXPORT
|
||||
int64_t clutter_frame_get_count (ClutterFrame *frame);
|
||||
|
||||
CLUTTER_EXPORT
|
||||
void clutter_frame_set_result (ClutterFrame *frame,
|
||||
ClutterFrameResult result);
|
||||
@ -33,4 +36,6 @@ void clutter_frame_set_result (ClutterFrame *frame,
|
||||
CLUTTER_EXPORT
|
||||
gboolean clutter_frame_has_result (ClutterFrame *frame);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterFrame, g_free)
|
||||
|
||||
#endif /* CLUTTER_FRAME_H */
|
||||
|
@ -1131,7 +1131,7 @@ clutter_stage_view_has_shadowfb (ClutterStageView *view)
|
||||
|
||||
static void
|
||||
handle_frame_clock_before_frame (ClutterFrameClock *frame_clock,
|
||||
int64_t frame_count,
|
||||
ClutterFrame *frame,
|
||||
gpointer user_data)
|
||||
{
|
||||
ClutterStageView *view = user_data;
|
||||
@ -1207,7 +1207,7 @@ end_frame_timing_measurement (ClutterStageView *view)
|
||||
|
||||
static ClutterFrameResult
|
||||
handle_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||
int64_t frame_count,
|
||||
ClutterFrame *frame,
|
||||
gpointer user_data)
|
||||
{
|
||||
ClutterStageView *view = user_data;
|
||||
@ -1216,7 +1216,6 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||
ClutterStage *stage = priv->stage;
|
||||
ClutterStageWindow *stage_window = _clutter_stage_get_window (stage);
|
||||
g_autoptr (GSList) devices = NULL;
|
||||
ClutterFrame frame;
|
||||
|
||||
if (CLUTTER_ACTOR_IN_DESTRUCTION (stage))
|
||||
return CLUTTER_FRAME_RESULT_IDLE;
|
||||
@ -1241,16 +1240,14 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||
if (priv->needs_update_devices)
|
||||
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);
|
||||
|
||||
if (clutter_stage_view_has_redraw_clip (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,
|
||||
g_get_monotonic_time ());
|
||||
@ -1261,7 +1258,7 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock,
|
||||
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);
|
||||
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_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 = {
|
||||
|
Reference in New Issue
Block a user