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>
Signed-off-by: Mingi Sung <sungmg@saltyming.net>
(cherry picked from commit 6ec1312384
)
This commit is contained in:
parent
96ca767e22
commit
efadfc4a94
10 changed files with 94 additions and 4 deletions
|
@ -740,6 +740,10 @@ clutter_stage_view_schedule_update (ClutterStageView *view)
|
||||||
{
|
{
|
||||||
ClutterStageViewPrivate *priv =
|
ClutterStageViewPrivate *priv =
|
||||||
clutter_stage_view_get_instance_private (view);
|
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);
|
clutter_frame_clock_schedule_update (priv->frame_clock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,8 @@ struct _ClutterStageViewClass
|
||||||
ClutterFrame * (* new_frame) (ClutterStageView *view);
|
ClutterFrame * (* new_frame) (ClutterStageView *view);
|
||||||
|
|
||||||
ClutterPaintFlag (* get_default_paint_flags) (ClutterStageView *view);
|
ClutterPaintFlag (* get_default_paint_flags) (ClutterStageView *view);
|
||||||
|
|
||||||
|
void (* schedule_update) (ClutterStageView *view);
|
||||||
};
|
};
|
||||||
|
|
||||||
CLUTTER_EXPORT
|
CLUTTER_EXPORT
|
||||||
|
|
|
@ -348,6 +348,15 @@ meta_crtc_kms_is_hw_cursor_supported (MetaCrtcNative *crtc_native)
|
||||||
return meta_kms_device_has_cursor_plane_for (kms_device, kms_crtc);
|
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 *
|
MetaKmsPlane *
|
||||||
meta_crtc_kms_get_assigned_cursor_plane (MetaCrtcKms *crtc_kms)
|
meta_crtc_kms_get_assigned_cursor_plane (MetaCrtcKms *crtc_kms)
|
||||||
{
|
{
|
||||||
|
@ -479,6 +488,7 @@ meta_crtc_kms_class_init (MetaCrtcKmsClass *klass)
|
||||||
|
|
||||||
crtc_native_class->is_transform_handled = meta_crtc_kms_is_transform_handled;
|
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->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] =
|
signals[GAMMA_LUT_CHANGED] =
|
||||||
g_signal_new ("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);
|
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
|
static void
|
||||||
meta_crtc_native_init (MetaCrtcNative *crtc_native)
|
meta_crtc_native_init (MetaCrtcNative *crtc_native)
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,9 +31,12 @@ struct _MetaCrtcNativeClass
|
||||||
gboolean (* is_transform_handled) (MetaCrtcNative *crtc_native,
|
gboolean (* is_transform_handled) (MetaCrtcNative *crtc_native,
|
||||||
MetaMonitorTransform monitor_transform);
|
MetaMonitorTransform monitor_transform);
|
||||||
gboolean (* is_hw_cursor_supported) (MetaCrtcNative *crtc_native);
|
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,
|
gboolean meta_crtc_native_is_transform_handled (MetaCrtcNative *crtc_native,
|
||||||
MetaMonitorTransform transform);
|
MetaMonitorTransform transform);
|
||||||
|
|
||||||
gboolean meta_crtc_native_is_hw_cursor_supported (MetaCrtcNative *crtc_native);
|
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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int64_t
|
||||||
|
meta_crtc_virtual_get_deadline_evasion (MetaCrtcNative *crtc_native)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_crtc_virtual_init (MetaCrtcVirtual *crtc_virtual)
|
meta_crtc_virtual_init (MetaCrtcVirtual *crtc_virtual)
|
||||||
{
|
{
|
||||||
|
@ -89,4 +95,6 @@ meta_crtc_virtual_class_init (MetaCrtcVirtualClass *klass)
|
||||||
meta_crtc_virtual_is_transform_handled;
|
meta_crtc_virtual_is_transform_handled;
|
||||||
crtc_native_class->is_hw_cursor_supported =
|
crtc_native_class->is_hw_cursor_supported =
|
||||||
meta_crtc_virtual_is_hw_cursor_supported;
|
meta_crtc_virtual_is_hw_cursor_supported;
|
||||||
|
crtc_native_class->get_deadline_evasion =
|
||||||
|
meta_crtc_virtual_get_deadline_evasion;
|
||||||
}
|
}
|
||||||
|
|
|
@ -610,10 +610,7 @@ meta_kms_crtc_determine_deadline (MetaKmsCrtc *crtc,
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (meta_is_topic_enabled (META_DEBUG_KMS))
|
deadline_evasion_us = meta_kms_crtc_get_deadline_evasion (crtc);
|
||||||
deadline_evasion_us = DEADLINE_EVASION_WITH_KMS_TOPIC_US;
|
|
||||||
else
|
|
||||||
deadline_evasion_us = DEADLINE_EVASION_US;
|
|
||||||
|
|
||||||
vblank_duration_us = meta_calculate_drm_mode_vblank_duration_us (drm_mode);
|
vblank_duration_us = meta_calculate_drm_mode_vblank_duration_us (drm_mode);
|
||||||
next_deadline_us = next_presentation_us - (vblank_duration_us +
|
next_deadline_us = next_presentation_us - (vblank_duration_us +
|
||||||
|
@ -625,3 +622,12 @@ meta_kms_crtc_determine_deadline (MetaKmsCrtc *crtc,
|
||||||
|
|
||||||
return TRUE;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -65,3 +65,5 @@ int meta_kms_crtc_get_idx (MetaKmsCrtc *crtc);
|
||||||
|
|
||||||
META_EXPORT_TEST
|
META_EXPORT_TEST
|
||||||
gboolean meta_kms_crtc_is_active (MetaKmsCrtc *crtc);
|
gboolean meta_kms_crtc_is_active (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-renderer-view-native.h"
|
||||||
|
|
||||||
|
#include "backends/native/meta-crtc-native.h"
|
||||||
#include "backends/native/meta-frame-native.h"
|
#include "backends/native/meta-frame-native.h"
|
||||||
|
|
||||||
struct _MetaRendererViewNative
|
struct _MetaRendererViewNative
|
||||||
|
@ -34,18 +35,58 @@ struct _MetaRendererViewNative
|
||||||
G_DEFINE_TYPE (MetaRendererViewNative, meta_renderer_view_native,
|
G_DEFINE_TYPE (MetaRendererViewNative, meta_renderer_view_native,
|
||||||
META_TYPE_RENDERER_VIEW)
|
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 *
|
static ClutterFrame *
|
||||||
meta_renderer_view_native_new_frame (ClutterStageView *stage_view)
|
meta_renderer_view_native_new_frame (ClutterStageView *stage_view)
|
||||||
{
|
{
|
||||||
return (ClutterFrame *) meta_frame_native_new ();
|
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
|
static void
|
||||||
meta_renderer_view_native_class_init (MetaRendererViewNativeClass *klass)
|
meta_renderer_view_native_class_init (MetaRendererViewNativeClass *klass)
|
||||||
{
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
ClutterStageViewClass *stage_view_class = CLUTTER_STAGE_VIEW_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->new_frame = meta_renderer_view_native_new_frame;
|
||||||
|
stage_view_class->schedule_update = meta_renderer_view_native_schedule_update;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -517,6 +517,12 @@ meta_crtc_test_set_gamma_lut (MetaCrtc *crtc,
|
||||||
sizeof (uint16_t) * lut->size);
|
sizeof (uint16_t) * lut->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int64_t
|
||||||
|
meta_crtc_test_get_deadline_evasion (MetaCrtcNative *crtc_native)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_crtc_test_finalize (GObject *object)
|
meta_crtc_test_finalize (GObject *object)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue