On Tue, 2009-02-17 at 10:34 -0800, Jesse Barnes wrote:
> On Tuesday, February 17, 2009 9:43 am Michel Dänzer wrote:
> > On Tue, 2009-02-17 at 09:27 -0800, Jesse Barnes wrote:
> > > On Tuesday, February 17, 2009 9:04 am Michel Dänzer wrote:
> > > > On Mon, 2009-02-16 at 10:42 -0800, Jesse Barnes wrote:
> > > > > On Sunday, February 15, 2009 11:33 pm Michel Dänzer wrote:
> > > > > > On Fri, 2009-02-13 at 10:27 -0800, Jesse Barnes wrote:
> > > > > > > Recall our last discussion where I outlined the cases we'd have
> > > > > > > to deal with in the modeset ioctl if we didn't use get/put to
> > > > > > > just keep interrupts on around the calls:
> > > > > >
> > > > > > But we are intending to keep them on around the calls. So the
> > > > > > problem is that you are disabling the IRQ in between? Maybe a
> > > > > > solution could be not to mess with the counter when
> > > > > > disabling/enabling the IRQ. It needs to be guarded by the modeset
> > > > > > ioctl anyway, so shouldn't that work?
> > > > >
> > > > > The current problem isn't a disable between modeset ioctls, it's a
> > > > > disable followed by a counter reset of any kind (modeset ioctls or
> > > > > not), since the "last" count we track is just done in the disable
> > > > > function, not in the modeset ioctl.  Doing in in the modeset ioctl
> > > > > instead may be possible, but as I said there are lots of cases to
> > > > > deal with.
> > > >
> > > > Isn't the actual problem that drm_irq_uninstall() updates last_vblank?
> > > > If it didn't (and the modeset ioctl is properly called around the
> > > > disabling and re-enabling of the IRQ), wouldn't it just work?
> > >
> > > No, this happens w/o an uninstall, it's just due to wraparound being
> > > added between the disable timer & the next drm_vblank_get.
> >
> > I still don't understand the problem then; this can only happen if there
> > actually was a wraparound, as the drm_vblank_get must happen (via the
> > modeset ioctl) before the hardware frame counter resets for any other
> > reason.
> 
> Maybe I'm misunderstanding the problem, lemme walk through the logic:
>   - we're running along, and at some point the vblank disable timer fires
>     -> last_vblank = current counter (23252 for example)
>   - at some later point we do a DPMS or mode set, pre-modeset is called:
>     - call drm_vblank_get
>     - enable vblank events
>     - get current counter (should be >23252 if called correctly)
>     - diff = cur - last (some small number)
>     - diff is added
>   - post mode set
>     - just put (re-enable the timer) and clear the modeset flag
>   - another DPMS event comes in before the timer fires
>     - modeset flag is clear so it goes through the normal path
>     - call drm_vblank_get
>     - enable events
>     - get current counter (will be small this time)
>     - diff = cur - last (some large number, and cur < last)
>     - wraparound value + diff is added

The second drm_vblank_get doesn't call drm_update_vblank_counter, as
vblank_enabled is still 1.


-- 
Earthling Michel Dänzer           |                http://www.vmware.com
Libre software enthusiast         |          Debian, X and DRI developer

------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to