compositor-drm: deliver frame seq for feedback
Add 'msc' field to weston_output to maintain the refresh counter, and use it in presentation_feedback.presented. Make compositor-drm update the per-output refresh counter with the values reported by DRM. If the DRM reported value jumps backwards, assume it wrapped around once. Other backends do not update weston_output::msc, and there presentation_feedback will always deliver refresh counter as zero. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> v3 Reviewed-by: Mario Kleiner <mario.kleiner.de@gmail.com>
This commit is contained in:
parent
133e439674
commit
641307ca21
@ -725,6 +725,17 @@ finish_frame:
|
||||
weston_output_finish_frame(output_base, &ts);
|
||||
}
|
||||
|
||||
static void
|
||||
drm_output_update_msc(struct drm_output *output, unsigned int seq)
|
||||
{
|
||||
uint64_t msc_hi = output->base.msc >> 32;
|
||||
|
||||
if (seq < (output->base.msc & 0xffffffff))
|
||||
msc_hi++;
|
||||
|
||||
output->base.msc = (msc_hi << 32) + seq;
|
||||
}
|
||||
|
||||
static void
|
||||
vblank_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec,
|
||||
void *data)
|
||||
@ -733,6 +744,7 @@ vblank_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec,
|
||||
struct drm_output *output = s->output;
|
||||
struct timespec ts;
|
||||
|
||||
drm_output_update_msc(output, frame);
|
||||
output->vblank_pending = 0;
|
||||
|
||||
drm_output_release_fb(output, s->current);
|
||||
@ -756,6 +768,8 @@ page_flip_handler(int fd, unsigned int frame,
|
||||
struct drm_output *output = (struct drm_output *) data;
|
||||
struct timespec ts;
|
||||
|
||||
drm_output_update_msc(output, frame);
|
||||
|
||||
/* We don't set page_flip_pending on start_repaint_loop, in that case
|
||||
* we just want to page flip to the current buffer to get an accurate
|
||||
* timestamp */
|
||||
|
@ -2065,7 +2065,7 @@ weston_output_finish_frame(struct weston_output *output,
|
||||
refresh_nsec = 1000000000000UL / output->current_mode->refresh;
|
||||
weston_presentation_feedback_present_list(&output->feedback_list,
|
||||
output, refresh_nsec, stamp,
|
||||
0);
|
||||
output->msc);
|
||||
|
||||
output->frame_time = stamp->tv_sec * 1000 + stamp->tv_nsec / 1000000;
|
||||
|
||||
|
@ -203,6 +203,7 @@ struct weston_output {
|
||||
struct wl_signal destroy_signal;
|
||||
int move_x, move_y;
|
||||
uint32_t frame_time; /* presentation timestamp in milliseconds */
|
||||
uint64_t msc; /* media stream counter */
|
||||
int disable_planes;
|
||||
int destroying;
|
||||
struct wl_list feedback_list;
|
||||
|
Loading…
Reference in New Issue
Block a user