renderer-view/native: Update deadline evasion each frame
The deadline evasion depends on debug flags, but they are not trackable, so update the deadline evasion each time we schedule an update. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3184>
This commit is contained in:
parent
5da94d2c1d
commit
6ec1312384
10 changed files with 96 additions and 4 deletions
|
@ -912,6 +912,10 @@ clutter_stage_view_schedule_update (ClutterStageView *view)
|
|||
{
|
||||
ClutterStageViewPrivate *priv =
|
||||
clutter_stage_view_get_instance_private (view);
|
||||
ClutterStageViewClass *view_class = CLUTTER_STAGE_VIEW_GET_CLASS (view);
|
||||
|
||||
if (view_class->schedule_update)
|
||||
view_class->schedule_update (view);
|
||||
|
||||
clutter_frame_clock_schedule_update (priv->frame_clock);
|
||||
}
|
||||
|
|
|
@ -42,6 +42,8 @@ struct _ClutterStageViewClass
|
|||
ClutterFrame * (* new_frame) (ClutterStageView *view);
|
||||
|
||||
ClutterPaintFlag (* get_default_paint_flags) (ClutterStageView *view);
|
||||
|
||||
void (* schedule_update) (ClutterStageView *view);
|
||||
};
|
||||
|
||||
CLUTTER_EXPORT
|
||||
|
|
|
@ -400,6 +400,15 @@ meta_crtc_kms_is_hw_cursor_supported (MetaCrtcNative *crtc_native)
|
|||
return meta_kms_device_has_cursor_plane_for (kms_device, kms_crtc);
|
||||
}
|
||||
|
||||
static int64_t
|
||||
meta_crtc_kms_get_deadline_evasion (MetaCrtcNative *crtc_native)
|
||||
{
|
||||
MetaCrtcKms *crtc_kms = META_CRTC_KMS (crtc_native);
|
||||
MetaKmsCrtc *kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms);
|
||||
|
||||
return meta_kms_crtc_get_deadline_evasion (kms_crtc);
|
||||
}
|
||||
|
||||
MetaKmsPlane *
|
||||
meta_crtc_kms_get_assigned_cursor_plane (MetaCrtcKms *crtc_kms)
|
||||
{
|
||||
|
@ -533,6 +542,7 @@ meta_crtc_kms_class_init (MetaCrtcKmsClass *klass)
|
|||
|
||||
crtc_native_class->is_transform_handled = meta_crtc_kms_is_transform_handled;
|
||||
crtc_native_class->is_hw_cursor_supported = meta_crtc_kms_is_hw_cursor_supported;
|
||||
crtc_native_class->get_deadline_evasion = meta_crtc_kms_get_deadline_evasion;
|
||||
|
||||
signals[GAMMA_LUT_CHANGED] =
|
||||
g_signal_new ("gamma-lut-changed",
|
||||
|
|
|
@ -39,6 +39,14 @@ meta_crtc_native_is_hw_cursor_supported (MetaCrtcNative *crtc_native)
|
|||
return klass->is_hw_cursor_supported (crtc_native);
|
||||
}
|
||||
|
||||
int64_t
|
||||
meta_crtc_native_get_deadline_evasion (MetaCrtcNative *crtc_native)
|
||||
{
|
||||
MetaCrtcNativeClass *klass = META_CRTC_NATIVE_GET_CLASS (crtc_native);
|
||||
|
||||
return klass->get_deadline_evasion (crtc_native);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_native_init (MetaCrtcNative *crtc_native)
|
||||
{
|
||||
|
|
|
@ -32,9 +32,12 @@ struct _MetaCrtcNativeClass
|
|||
gboolean (* is_transform_handled) (MetaCrtcNative *crtc_native,
|
||||
MtkMonitorTransform monitor_transform);
|
||||
gboolean (* is_hw_cursor_supported) (MetaCrtcNative *crtc_native);
|
||||
int64_t (* get_deadline_evasion) (MetaCrtcNative *crtc_native);
|
||||
};
|
||||
|
||||
gboolean meta_crtc_native_is_transform_handled (MetaCrtcNative *crtc_native,
|
||||
MtkMonitorTransform transform);
|
||||
|
||||
gboolean meta_crtc_native_is_hw_cursor_supported (MetaCrtcNative *crtc_native);
|
||||
|
||||
int64_t meta_crtc_native_get_deadline_evasion (MetaCrtcNative *crtc_native);
|
||||
|
|
|
@ -70,6 +70,12 @@ meta_crtc_virtual_is_hw_cursor_supported (MetaCrtcNative *crtc_native)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static int64_t
|
||||
meta_crtc_virtual_get_deadline_evasion (MetaCrtcNative *crtc_native)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_virtual_init (MetaCrtcVirtual *crtc_virtual)
|
||||
{
|
||||
|
@ -89,4 +95,6 @@ meta_crtc_virtual_class_init (MetaCrtcVirtualClass *klass)
|
|||
meta_crtc_virtual_is_transform_handled;
|
||||
crtc_native_class->is_hw_cursor_supported =
|
||||
meta_crtc_virtual_is_hw_cursor_supported;
|
||||
crtc_native_class->get_deadline_evasion =
|
||||
meta_crtc_virtual_get_deadline_evasion;
|
||||
}
|
||||
|
|
|
@ -625,10 +625,7 @@ meta_kms_crtc_determine_deadline (MetaKmsCrtc *crtc,
|
|||
*
|
||||
*/
|
||||
|
||||
if (meta_is_topic_enabled (META_DEBUG_KMS))
|
||||
deadline_evasion_us = DEADLINE_EVASION_WITH_KMS_TOPIC_US;
|
||||
else
|
||||
deadline_evasion_us = DEADLINE_EVASION_US;
|
||||
deadline_evasion_us = meta_kms_crtc_get_deadline_evasion (crtc);
|
||||
|
||||
vblank_duration_us = meta_calculate_drm_mode_vblank_duration_us (drm_mode);
|
||||
next_deadline_us = next_presentation_us - (vblank_duration_us +
|
||||
|
@ -640,3 +637,12 @@ meta_kms_crtc_determine_deadline (MetaKmsCrtc *crtc,
|
|||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int64_t
|
||||
meta_kms_crtc_get_deadline_evasion (MetaKmsCrtc *crtc)
|
||||
{
|
||||
if (meta_is_topic_enabled (META_DEBUG_KMS))
|
||||
return DEADLINE_EVASION_WITH_KMS_TOPIC_US;
|
||||
else
|
||||
return DEADLINE_EVASION_US;
|
||||
}
|
||||
|
|
|
@ -67,3 +67,5 @@ META_EXPORT_TEST
|
|||
gboolean meta_kms_crtc_is_active (MetaKmsCrtc *crtc);
|
||||
|
||||
gboolean meta_kms_crtc_is_leased (MetaKmsCrtc *crtc);
|
||||
|
||||
int64_t meta_kms_crtc_get_deadline_evasion (MetaKmsCrtc *crtc);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include "backends/native/meta-renderer-view-native.h"
|
||||
|
||||
#include "backends/native/meta-crtc-native.h"
|
||||
#include "backends/native/meta-frame-native.h"
|
||||
|
||||
struct _MetaRendererViewNative
|
||||
|
@ -34,18 +35,58 @@ struct _MetaRendererViewNative
|
|||
G_DEFINE_TYPE (MetaRendererViewNative, meta_renderer_view_native,
|
||||
META_TYPE_RENDERER_VIEW)
|
||||
|
||||
static void
|
||||
update_frame_clock_deadline_evasion (MetaRendererView *renderer_view)
|
||||
{
|
||||
ClutterStageView *stage_view = CLUTTER_STAGE_VIEW (renderer_view);
|
||||
ClutterFrameClock *frame_clock;
|
||||
MetaCrtc *crtc;
|
||||
MetaCrtcNative *crtc_native;
|
||||
int64_t deadline_evasion_us;
|
||||
|
||||
frame_clock = clutter_stage_view_get_frame_clock (stage_view);
|
||||
crtc = meta_renderer_view_get_crtc (renderer_view);
|
||||
crtc_native = META_CRTC_NATIVE (crtc);
|
||||
|
||||
deadline_evasion_us = meta_crtc_native_get_deadline_evasion (crtc_native);
|
||||
clutter_frame_clock_set_deadline_evasion (frame_clock,
|
||||
deadline_evasion_us);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_renderer_view_native_constructed (GObject *object)
|
||||
{
|
||||
MetaRendererView *renderer_view = META_RENDERER_VIEW (object);
|
||||
|
||||
G_OBJECT_CLASS (meta_renderer_view_native_parent_class)->constructed (object);
|
||||
|
||||
update_frame_clock_deadline_evasion (renderer_view);
|
||||
}
|
||||
|
||||
static ClutterFrame *
|
||||
meta_renderer_view_native_new_frame (ClutterStageView *stage_view)
|
||||
{
|
||||
return (ClutterFrame *) meta_frame_native_new ();
|
||||
}
|
||||
|
||||
static void
|
||||
meta_renderer_view_native_schedule_update (ClutterStageView *stage_view)
|
||||
{
|
||||
MetaRendererView *renderer_view = META_RENDERER_VIEW (stage_view);
|
||||
|
||||
update_frame_clock_deadline_evasion (renderer_view);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_renderer_view_native_class_init (MetaRendererViewNativeClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
ClutterStageViewClass *stage_view_class = CLUTTER_STAGE_VIEW_CLASS (klass);
|
||||
|
||||
object_class->constructed = meta_renderer_view_native_constructed;
|
||||
|
||||
stage_view_class->new_frame = meta_renderer_view_native_new_frame;
|
||||
stage_view_class->schedule_update = meta_renderer_view_native_schedule_update;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -85,6 +85,12 @@ meta_crtc_test_is_hw_cursor_supported (MetaCrtcNative *crtc_native)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
static int64_t
|
||||
meta_crtc_test_get_deadline_evasion (MetaCrtcNative *crtc_native)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_test_finalize (GObject *object)
|
||||
{
|
||||
|
@ -114,6 +120,8 @@ meta_crtc_test_class_init (MetaCrtcTestClass *klass)
|
|||
meta_crtc_test_is_transform_handled;
|
||||
crtc_native_class->is_hw_cursor_supported =
|
||||
meta_crtc_test_is_hw_cursor_supported;
|
||||
crtc_native_class->get_deadline_evasion =
|
||||
meta_crtc_test_get_deadline_evasion;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in a new issue