diff options
author | Mario Kleiner <mario.kleiner@tuebingen.mpg.de> | 2011-02-20 23:42:02 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-02-22 19:08:49 -0500 |
commit | 9be6f8a978bdcbab46474a125aa4212516b71fe7 (patch) | |
tree | 060d33b9eef457ad6f794804052a443c6f91347a /drivers/gpu/drm/drm_irq.c | |
parent | bc21512835a72bc1eab7abd7d8a1bff0435591d7 (diff) |
drm/vblank: Enable precise vblank timestamps for interlaced and doublescan modes.
Testing showed the current code can already handle doublescan
video modes just fine. A trivial tweak makes it work for interlaced
scanout as well.
Tested and shown to be precise on Radeon rv530, r600 and
Intel 945-GME.
Signed-off-by: Mario Kleiner <mario.kleiner@tuebingen.mpg.de>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/drm_irq.c')
-rw-r--r-- | drivers/gpu/drm/drm_irq.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 22f3bf5ecbd2..53120a72a48c 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
@@ -493,6 +493,12 @@ void drm_calc_timestamping_constants(struct drm_crtc *crtc) | |||
493 | /* Dot clock in Hz: */ | 493 | /* Dot clock in Hz: */ |
494 | dotclock = (u64) crtc->hwmode.clock * 1000; | 494 | dotclock = (u64) crtc->hwmode.clock * 1000; |
495 | 495 | ||
496 | /* Fields of interlaced scanout modes are only halve a frame duration. | ||
497 | * Double the dotclock to get halve the frame-/line-/pixelduration. | ||
498 | */ | ||
499 | if (crtc->hwmode.flags & DRM_MODE_FLAG_INTERLACE) | ||
500 | dotclock *= 2; | ||
501 | |||
496 | /* Valid dotclock? */ | 502 | /* Valid dotclock? */ |
497 | if (dotclock > 0) { | 503 | if (dotclock > 0) { |
498 | /* Convert scanline length in pixels and video dot clock to | 504 | /* Convert scanline length in pixels and video dot clock to |
@@ -605,14 +611,6 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc, | |||
605 | return -EAGAIN; | 611 | return -EAGAIN; |
606 | } | 612 | } |
607 | 613 | ||
608 | /* Don't know yet how to handle interlaced or | ||
609 | * double scan modes. Just no-op for now. | ||
610 | */ | ||
611 | if (mode->flags & (DRM_MODE_FLAG_INTERLACE | DRM_MODE_FLAG_DBLSCAN)) { | ||
612 | DRM_DEBUG("crtc %d: Noop due to unsupported mode.\n", crtc); | ||
613 | return -ENOTSUPP; | ||
614 | } | ||
615 | |||
616 | /* Get current scanout position with system timestamp. | 614 | /* Get current scanout position with system timestamp. |
617 | * Repeat query up to DRM_TIMESTAMP_MAXRETRIES times | 615 | * Repeat query up to DRM_TIMESTAMP_MAXRETRIES times |
618 | * if single query takes longer than max_error nanoseconds. | 616 | * if single query takes longer than max_error nanoseconds. |