On Sun, 2 Dec 2001, Billy Biggs wrote:

> Mark Vojkovich ([EMAIL PROTECTED]):
> 
> > > I noticed nasty tearing when using my DVD player + XVideo.  This is
> > > in contrast to the i810 driver which will wait to blit if called
> > > during the retrace.  My code now spins on the VGA port, which fixed
> > > the tearing.
> > 
> > No, that's not what happens.  The MGA driver doesn't double buffer
> > video so you get tearing.  The i810 driver does so you don't.  I doubt
> > spinning on the client side can do anything to prevent tearing.
> 
>   But if it double buffered it would still need to flip-on-retrace.

   Most hardware can't not flip on retrace.  I believe the MGA
is one of the exceptions where you can program it to flip on a
particular line number, the special case of, which is flipping at
the retrace.
  
> 
>   So you're saying that my spinning on the client is just making the
> video not suck by coincidence?

   You're still getting a tear, it's just always happenning at
the same place so it's not so noticeable.  You've essentially
synced your software to the retrace, but there's no way the
X-server can copy the data to the overlay entirely within
the retrace.  There's not enough time.  The tear is just happening
a fixed time after the retrace.

> 
> > I think you misunderstand what the i810 driver is doing.  [...]
> 
>   Thanks for the clarification.
> 
> > >   Do other drivers spin on a call to XvPut if the refresh is occuring?
> > 
> > No.  If you send faster than the retrace on NVIDIA hardware I just let
> > it shear because I don't want the X-server eating CPU.  Below the
> > refresh rate, it won't shear.
> 
>   So, if I'm running my display at 59.94hz and sending it NTSC video,
> there's no way for me to get in sync without having some way of querying
> the refresh, yeah?

    The i810 would stall you if it were displaying a frame and already
had another queued when you sent the next frame.  I could do that, but 
I chose not to.  You can see the place in the "nv" driver where I had
code to do that and commented it out.

> 
> > >   Also, I wait for the refresh using something like this code:
> > > 
> > >   void spin_until_refresh_complete( void ) {
> > >     for(;;) if( inb( 0x3da ) & 8 ) break;
> > >   }
> > > 
> > > Does anyone know what VGA cards this could fail on?  So far it's
> > > worked great for my i815, G400, and TNT2.
> > 
> > It won't necessarily work on those.  It depends whether or not I/O
> > access is enabled.  In the case of secondary cards, port access to
> > legacy VGA registers is typically disabled. 
> 
>   Ok, what do you mean by this?  Is this a software or hardware setting
> or what?

   What if you have two VGA cards in the machine?  Who gets 0x3da?
Not both obviously.  The bios will disable access to one of them
and the card can't be accessed in that fashion.  Drivers like
the "nv" and "mga" drivers don't program the card with port I/O.
They do memory mapped I/O for everything so it's really not even
necessary for proper server operation that the vga registers are
even operational.  The XFree86 RAC code may very well disable
access to them.  Actually, I thought it did, but I guess since
you are finding something there, it must not have.


                                Mark.


_______________________________________________
Xpert mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/xpert

Reply via email to