* video sync timing
@ 2005-08-27 19:28 Richard Cooper
2005-08-29 21:25 ` video sync timing + softer update Richard Cooper
0 siblings, 1 reply; 10+ messages in thread
From: Richard Cooper @ 2005-08-27 19:28 UTC (permalink / raw)
To: linux-assembly
Any ideas how I might sync to bit 3 of port 0x3DA, the video card's
vertical sync signal?
Just watching the bit in a loop doesn't seem like a good idea, since the
CPU could be off doing something else, but as far as I know any timer
function I might use will only be accurate to 1/100 of a second, which
wouldn't be much better than watching the bit in a loop.
Since things like DOOM run in Linux, I think there must be some way to do
it. I've discovered that simutaneously changing the screen data and the
color palette without synchronization creates a flicker of a mess on the
screen, and DOOM doesn't do that in Linux, so I guess it must be
synchronizing somehow.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: video sync timing + softer update
2005-08-27 19:28 video sync timing Richard Cooper
@ 2005-08-29 21:25 ` Richard Cooper
2005-08-30 1:40 ` Frank Kotler
2005-08-30 2:54 ` Stephen Ray
0 siblings, 2 replies; 10+ messages in thread
From: Richard Cooper @ 2005-08-29 21:25 UTC (permalink / raw)
To: linux-assembly
> Any ideas how I might sync to bit 3 of port 0x3DA, the video card's
> vertical sync signal?
Well, I don't know if anyone cares, but since I asked the question here, I
figure it's appropriate to let everyone know what I came up with.
As best I can tell, it's just not possible under Linux. Everything that
does vertical refresh syncing in Linux does it with a CPU-time-eating busy
loop. It seems it isn't possible to give up the CPU for a period of time
shorter than 10-20ms. Since vertical retraces occur every 17ms, and 17 <
20, if you want to have the CPU when the next retrace occurs, you can't do
any kind of sleeping. This is the case even under "realtime scheduling,"
which seems to be a misnomer for what would be better called "priority
scheduling."
Anyway, I also updated Softer so that it has that fun command that lets
you just give it video data and it displays it. If you want it, you can
download it from the link at the bottom of this message board post:
http://xerse.nfshost.com/funrestraints/post/000000000016.html
It's basically version 125, but I made it a "preview" because I'm too
angry now to bother with putting it through the amount of testing I
usually do. Seems to work just fine, though.
The last couple of paragraphs in that message are about Softer, the rest
is just ranting. You don't have to read the rants, but if you like
Softer, consider reading them as a way of supporting it's development. Or
some nonsense like that.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: video sync timing + softer update
2005-08-29 21:25 ` video sync timing + softer update Richard Cooper
@ 2005-08-30 1:40 ` Frank Kotler
2005-08-30 12:40 ` Richard Cooper
2005-08-30 2:54 ` Stephen Ray
1 sibling, 1 reply; 10+ messages in thread
From: Frank Kotler @ 2005-08-30 1:40 UTC (permalink / raw)
To: Richard Cooper; +Cc: linux-assembly
Richard Cooper wrote:
>> Any ideas how I might sync to bit 3 of port 0x3DA, the video card's
>> vertical sync signal?
I took the liberty or reposting your question to news:alt.lang.asm -
more of a warzone than an asm forum, these days, but we were discussing
polling loops, and I thought somebody might have some ideas.
One response was "I don't bother doing that anymore, vga doesn't need
it." Would be nice if it were true, but your experience seems to differ.
Another poster (f0dder) posted a link to Kris Heidenstrom's PC timing
FAQ, and its info on "emulating a Vertical Retrace Interrupt". All dos
stuff, it wouldn't work on Linux as written, of course. But I thought
the principles might be useful. However, that's pretty much what you've
tried, without success. I didn't realize that the resolution on the
timers was so bad. Oh, well...
I still think that this approach has as much promise as anything. If the
arithmetic doesn't work out... jeez, I'm really reluctant to say
anything's "impossible"...
...
> http://xerse.nfshost.com/funrestraints/post/000000000016.html
>
> It's basically version 125, but I made it a "preview" because I'm too
> angry now to bother with putting it through the amount of testing I
> usually do. Seems to work just fine, though.
Great. I haven't looked at 1.26pre yet - barely getting into 1.24 - but
it looks like a useful little tool, even if it *won't* synch. Making it
a command line option as you've done may be the best you can do.
> The last couple of paragraphs in that message are about Softer, the
> rest is just ranting. You don't have to read the rants, but if you
> like Softer, consider reading them as a way of supporting it's
> development. Or some nonsense like that.
Okay, I've done my part :) Sorry to hear you're meeting with such
frustration. Look on the bright side: Softer's a *hell* of a lot better
than no graphics at all (which is what I'm used to). Thanks for sharing
it with us!
Best,
Frank
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: video sync timing + softer update
2005-08-29 21:25 ` video sync timing + softer update Richard Cooper
2005-08-30 1:40 ` Frank Kotler
@ 2005-08-30 2:54 ` Stephen Ray
2005-08-30 13:44 ` Richard Cooper
1 sibling, 1 reply; 10+ messages in thread
From: Stephen Ray @ 2005-08-30 2:54 UTC (permalink / raw)
To: Richard Cooper; +Cc: linux-assembly
Richard Cooper wrote:
>> Any ideas how I might sync to bit 3 of port 0x3DA, the video card's
>> vertical sync signal?
>
>
> Well, I don't know if anyone cares, but since I asked the question here,
> I figure it's appropriate to let everyone know what I came up with.
>
> As best I can tell, it's just not possible under Linux. Everything
> that does vertical refresh syncing in Linux does it with a
> CPU-time-eating busy loop. It seems it isn't possible to give up the
> CPU for a period of time shorter than 10-20ms. Since vertical retraces
> occur every 17ms, and 17 < 20, if you want to have the CPU when the
> next retrace occurs, you can't do any kind of sleeping. This is the
> case even under "realtime scheduling," which seems to be a misnomer for
> what would be better called "priority scheduling."
>
What kernel series are you using? Did you compile it yourself? What is
HZ set at? 100? 250? 1000? If it's a 2.6 kernel, did you try enabling
preemption? With HZ at 100, it is impossible for the kernel to give you
better than 10 ms resolution. With HZ at 1000, it can achieve 1 ms
resolution (in theory). What else is running on your machine? These
questions could help answer whether it's possible.
Stephen
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: video sync timing + softer update
2005-08-30 1:40 ` Frank Kotler
@ 2005-08-30 12:40 ` Richard Cooper
0 siblings, 0 replies; 10+ messages in thread
From: Richard Cooper @ 2005-08-30 12:40 UTC (permalink / raw)
To: Frank Kotler; +Cc: linux-assembly
> I took the liberty or reposting your question to news:alt.lang.asm -
> more of a warzone than an asm forum, these days, but we were discussing
> polling loops, and I thought somebody might have some ideas.
I subscribed to that group so I can read the responses. Interesting to
learn that even the kernel's FB driver doesn't implement syncing. Even
so, I couldn't use it if it did, since Softer is non-framebuffer. When
not in framebuffer mode, opening /dev/fb0 returns ENODEV or something like
that, so using it's IOCTLs isn't possible.
> One response was "I don't bother doing that anymore, vga doesn't need
> it." Would be nice if it were true, but your experience seems to differ.
Many things won't require it, but as this script shows, it's needed
sometimes. Just compare how it looks when running with -s as opposed to
not running with -s. There's quite a difference.
http://xerse.nfshost.com/secret/softer/sync_test.pl
(this script needs the general_functions.pl included with softer)
It's kind of hard to see, since softer doesn't do syncing when it's not
the active console, and so just running 'top' you won't see it, but if you
run the processor_utilization.pl script included with softer on another
console, you can see that when softer runs with -s, you're basically using
100% of the cpu (or close to it, those select calls in the script have to
be sleeping a little). Without -s it looks like it takes about 4%.
However, that's not what my problem is. I haven't actually seen tearing
outside of that test script. Here's a script (and two files it needs)
that demonstrates my problem:
http://xerse.nfshost.com/secret/softer/picture_sync_test.pl
http://xerse.nfshost.com/secret/softer/1.orange
http://xerse.nfshost.com/secret/softer/2.orange
It just flips between two images at 30 fps, to pretend like it's showing
video. (including enough images for a real video would have made one big
tar file) When run with -s it works fine, except that it takes about 50%
of my CPU time. When run without -s, it uses about 4%, however, it's got
these bars of static in it that are about 1/4 of the screen tall, making
it look kind of like a VHS tape on fast-forward.
It turns out that DOOM doesn't have this problem because even though it
changes palettes, the pixel data on the screen is valid for both the old
and the new palette. These two images were each converted to their own
256-color palette, and so each image when displayed with the other's
palette just looks like garbage.
Since the palette changes take place immediately, (when softer writes to
the registers), regardless of where the CRT beam is, you get that static
stuff displayed between the time where you change the palette and the time
when you change the pixel data, so you have to wait for the beginning of a
retrace, change the palette, and then update the frame.
> Another poster (f0dder) posted a link to Kris Heidenstrom's PC timing
> FAQ, and its info on "emulating a Vertical Retrace Interrupt".
I had a look at it, it basically describes what I was talking about on my
message board, using the PIT to synchronize with the vertical retrace
(although they call it the CTC which I believe is the Z80 equivelent,
which isn't used in the PC). Linux could do that on our behalf (using the
PIT like I described to provide multiple timing signals), but it insist on
keeping the PIT programmed to a single value, 100Hz.
> Sorry to hear you're meeting with such frustration.
Happens every time I work on Softer. There's just so many stupid things
about the kernel, like how with it's aquire/release signals, it'll send
you one even if you're still in the signal handler for the last one it
sent you. There's no reason it should do that, and it's insane to expect
any code to be able to deal with that.
On the not-so-dark side, at least the solution I came up with (in
switcher.asm) seems to work. I wrote a test script that told the kernel
to switch consoles as fast as possible, and Softer didn't have a problem
with it.
> Look on the bright side: Softer's a *hell* of a lot better than no
> graphics at all (which is what I'm used to).
I just wish it did text in graphics modes. I also wish it could draw
circles. (Yes, I could make it do both, but when I feel like working on
it there always seems to be something else that should be done first.)
And sprite support would be awesome, but I'm afraid to touch anything that
involves memory management. It'd make it really easy to make games,
though.
There's also no way to tell from the video mode packet wether or not a
given mode supports graphics. I didn't realize that until last night.
I've never actually used the video mode packet because I know what the
modes are.
Email me if you run into any problems with it. I rarely get emails about
it, which I guess I should take to mean that it works just fine, but I
can't help but worry that people just aren't reporting problems. Also,
I'd love to have an FAQ for it, but with no questions, that's not going
anywhere.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: video sync timing + softer update
2005-08-30 2:54 ` Stephen Ray
@ 2005-08-30 13:44 ` Richard Cooper
2005-08-30 17:36 ` Stephen Ray
0 siblings, 1 reply; 10+ messages in thread
From: Richard Cooper @ 2005-08-30 13:44 UTC (permalink / raw)
To: Stephen Ray; +Cc: linux-assembly
> What kernel series are you using?
Linux version 2.4.26
> Did you compile it yourself?
Possibly, I've compiled kernels before, but I think this one did
everything I needed out of the box, so I didn't have to recompile it.
> What is HZ set at?
Aparently 100. I wasn't aware you could change it. I wanted to once
since Linux's multitasking is so sludgy sometimes, but I couldn't figure
out how to do it.
(Turns out the slugyness is because it'll give processes more than one
timeslice in a row, it'll give them like 20 before switching tasks, so
you're only switching tasks 5 times a second. Maybe I should just run
everything under SCHED_RR...)
> If it's a 2.6 kernel, did you try enabling preemption?
I'm afraid to try 2.6. I've heard nothing good about it. (in fact, this
is the first time I've seen 2.6 mentioned without being in relation to
something not working because of it)
It's not a problem with kernel threads blocking the scheduling, the kernel
is just sitting idle when I run my test program. As best I can tell, the
kernel simply doesn't want to schedule things outside of it's 10ms time
slices. So when I try to sleep for any amount of time, the wakeup time is
always set for the beginning of one of those 10ms slices. (which is the
documented behavior, I'm just surprised to see that "realtime scheduling"
doesn't fix it) It's not that the kernel is incapable of splitting slices
between processes, it does it all the time. It just won't schedule
anything that way.
> What else is running on your machine?
1 ? 00:00:04 init
2 ? 00:00:03 keventd
3 ? 00:00:00 ksoftirqd_CPU0
4 ? 00:00:06 kswapd
5 ? 00:00:00 bdflush
6 ? 00:00:00 kupdated
10 ? 00:00:00 mdrecoveryd
11 ? 00:00:00 kreiserfsd
60 ? 00:00:00 syslogd
63 ? 00:00:00 klogd
172 ? 00:00:00 khubd
872 ? 00:00:00 usb-storage-0
873 ? 00:00:00 scsi_eh_1
972 ? 00:00:00 inetd
987 ? 00:00:00 cupsd
1009 ? 00:00:00 crond
1012 ? 00:00:00 httpd
1013 tty1 00:00:00 bash
1014 tty2 00:00:00 bash
1015 tty3 00:00:00 bash
1016 tty4 00:00:00 agetty
1017 tty5 00:00:00 agetty
1018 tty6 00:00:00 agetty
1019 tty7 00:00:00 bash
1020 tty8 00:00:00 bash
1021 tty11 00:00:00 agetty
1022 ? 00:00:00 adserver
1023 ? 00:00:00 faucet
1024 ? 00:00:00 httpd
1025 ? 00:00:00 httpd
1026 ? 00:00:00 httpd
1027 ? 00:00:00 httpd
1028 ? 00:00:00 httpd
2191 tty8 00:00:00 startx
2203 tty8 00:00:00 xinit
2204 ? 00:01:09 X
2208 tty8 00:00:00 xinitrc
2209 tty8 00:00:00 startkde
2222 ? 00:00:00 kdeinit
2225 ? 00:00:00 kdeinit
2227 ? 00:00:00 kdeinit
2230 ? 00:00:00 kdeinit
2241 ? 00:00:00 kdeinit
2242 tty8 00:00:00 kwrapper
2244 ? 00:00:00 kdeinit
2245 ? 00:00:01 kdeinit
2247 ? 00:00:00 kdeinit
2249 ? 00:00:00 kdeinit
2251 ? 00:00:00 kdeinit
2254 ? 00:00:03 kdeinit
2258 ? 00:00:00 kdeinit
2260 ? 00:00:00 korgac
2319 ? 00:00:00 adserver.pl <defunct>
2768 ? 00:00:00 adserver.pl <defunct>
2786 ? 00:00:00 adserver.pl <defunct>
3407 ? 00:00:00 adserver.pl <defunct>
6815 ? 00:00:00 httpd
8789 ? 00:00:00 adserver.pl <defunct>
9494 ? 00:00:00 adserver.pl <defunct>
10241 tty7 00:00:00 startx
10252 tty7 00:00:00 xinit
10253 ? 00:09:30 X
10257 tty7 00:00:00 xinitrc
10258 tty7 00:00:00 startkde
10277 ? 00:00:00 kdeinit
10280 ? 00:00:00 kdeinit
10282 ? 00:00:00 kdeinit
10285 ? 00:00:00 kdeinit
10294 ? 00:00:00 artsd
10296 ? 00:00:00 kdeinit
10297 tty7 00:00:00 kwrapper
10299 ? 00:00:00 kdeinit
10300 ? 00:00:04 kdeinit
10302 ? 00:00:00 kdeinit
10305 ? 00:00:02 kdeinit
10306 ? 00:00:03 kdeinit
10309 ? 00:00:06 kdeinit
10311 ? 00:00:00 kdeinit
10312 ? 00:00:00 kdeinit
10313 ? 00:00:02 kdeinit
10318 ? 00:03:35 opera
10344 ? 00:00:00 opera
10376 ? 00:00:00 adserver.pl <defunct>
11897 ? 00:00:00 adserver.pl <defunct>
11986 ? 00:00:00 adserver.pl <defunct>
11989 ? 00:00:00 adserver.pl <defunct>
11990 ? 00:00:00 adserver.pl <defunct>
11991 ? 00:00:00 adserver.pl <defunct>
12417 ? 00:00:10 gedit
12419 ? 00:00:00 gconfd-2
12421 ? 00:00:00 bonobo-activati
12480 ? 00:00:12 kdeinit
12498 ? 00:00:00 kdeinit
12879 ? 00:00:00 kdeinit
12891 ? 00:00:00 httpd
12892 ? 00:00:00 httpd
12893 ? 00:00:00 httpd
12894 ? 00:00:00 httpd
13338 tty2 00:00:00 softer
13340 tty2 00:00:00 processor_utili
13493 ? 00:00:00 kdeinit
13494 pts/1 00:00:00 bash
13565 pts/1 00:00:00 ps
top says 0.3% user, 0.7% system, 99% idle
No, I didn't mess it up, there really are two copies of X running.
> These questions could help answer whether it's possible.
I don't want to require that people modify their kernel just to run
Softer. The way it is now, you download it, and it just works. (Or it
tells you your in framebuffer mode.) I download Linux programs now and
then, and 75% of the time they don't work. I don't want Softer to be like
that.
The reason it works so well now is because it doesn't depend on anything.
You don't need libraries, you don't even have to compile it, the binary
will work just fine. If people have to modify their kernel, then it's
working becomes dependant on wether or not the kernel modifications are
sucessful. I can make sure that Softer will work, but I can't do anything
to make sure that kernel modifications will work.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: video sync timing + softer update
2005-08-30 13:44 ` Richard Cooper
@ 2005-08-30 17:36 ` Stephen Ray
2005-08-30 20:24 ` Richard Cooper
0 siblings, 1 reply; 10+ messages in thread
From: Stephen Ray @ 2005-08-30 17:36 UTC (permalink / raw)
To: Richard Cooper; +Cc: linux-assembly
Richard Cooper wrote:
>> What kernel series are you using?
>
>
> Linux version 2.4.26
>
>> Did you compile it yourself?
>
>
> Possibly, I've compiled kernels before, but I think this one did
> everything I needed out of the box, so I didn't have to recompile it.
>
>> What is HZ set at?
>
>
> Aparently 100. I wasn't aware you could change it. I wanted to once
> since Linux's multitasking is so sludgy sometimes, but I couldn't
> figure out how to do it.
>
> (Turns out the slugyness is because it'll give processes more than one
> timeslice in a row, it'll give them like 20 before switching tasks, so
> you're only switching tasks 5 times a second. Maybe I should just run
> everything under SCHED_RR...)
>
>> If it's a 2.6 kernel, did you try enabling preemption?
>
>
> I'm afraid to try 2.6. I've heard nothing good about it. (in fact,
> this is the first time I've seen 2.6 mentioned without being in
> relation to something not working because of it)
>
I know there were teething problems. I suspect a lot of it was due to
widespread use of certain assumptions about kernel behaviour. When the
behaviour changed, it broke libraries and applications. But, it's been
almost 2 years now, and it's not like they're going to be returning to
the 2.4 way of doing things. 2.6 also introduces a lot of improvements
in the way the kernel works.
> It's not a problem with kernel threads blocking the scheduling, the
> kernel is just sitting idle when I run my test program. As best I can
> tell, the kernel simply doesn't want to schedule things outside of it's
> 10ms time slices. So when I try to sleep for any amount of time, the
> wakeup time is always set for the beginning of one of those 10ms
> slices. (which is the documented behavior, I'm just surprised to see
> that "realtime scheduling" doesn't fix it) It's not that the kernel is
> incapable of splitting slices between processes, it does it all the
> time. It just won't schedule anything that way.
Realtime scheduling doesn't change the fact that the clock only ticks HZ
times a second. If you've got a 100 Hz tick rate, you'll only do
scheduling on 10 ms intervals. It will split slices between processes,
but (if I recall correctly) only when the kernel is interrupted, and the
scheduler finds that a higher-priority process is ready to run, or
currently running process yields the process (waiting for I/O, or
explicitly yielding). You certainly can't rely on this, and the kernel
has no universally-available way of telling how far into a tick it is.
>
> I don't want to require that people modify their kernel just to run
> Softer. The way it is now, you download it, and it just works. (Or it
> tells you your in framebuffer mode.) I download Linux programs now and
> then, and 75% of the time they don't work. I don't want Softer to be
> like that.
>
> The reason it works so well now is because it doesn't depend on
> anything. You don't need libraries, you don't even have to compile it,
> the binary will work just fine. If people have to modify their kernel,
> then it's working becomes dependant on wether or not the kernel
> modifications are sucessful. I can make sure that Softer will work,
> but I can't do anything to make sure that kernel modifications will work.
Well, the 2.6 kernel has been the mainline kernel since December 2003. I
don't know of any major distros that doesn't distribute a 2.6 kernel,
and most no longer ship 2.4. In addition, several distros, notably
Redhat, shipped 2.4 kernels with the tick rate set at 1000 Hz rather
than 100 in later versions. Unfortunately, Hz (with almost all kernels)
has to be set at kernel compile time (although there is a lot of work
being done trying to set the PIT tick rate dynamically).
I understand why you'd want something that runs with stock kernels.
However, I would suspect that most people are running with kernels using
1000 Hz. Why not embrace that fact, rather than beating your head
against the 100 Hz tick rate?
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: video sync timing + softer update
2005-08-30 17:36 ` Stephen Ray
@ 2005-08-30 20:24 ` Richard Cooper
2005-08-31 0:51 ` video sync: result of 2.6 kernel experimenting Richard Cooper
0 siblings, 1 reply; 10+ messages in thread
From: Richard Cooper @ 2005-08-30 20:24 UTC (permalink / raw)
To: Stephen Ray; +Cc: linux-assembly
> I understand why you'd want something that runs with stock kernels.
> However, I would suspect that most people are running with kernels using
> 1000 Hz. Why not embrace that fact, rather than beating your head
> against the 100 Hz tick rate?
I wasn't aware that 2.6 used HZ=1000 by default. I'll have to look into
that then, because it's certainly possible to make Softer do what it's
doing now with HZ=100, and actually do some sleeping with HZ=1000. I
thought all kernels used HZ=100, and I wasn't about to tell people "you
should recompile your kernel to make Softer work better."
Anyway, the Softer download page has been begging for someone to send me a
register dump from a 2.6 kernel, but it doesn't look like anyone is going
to do it. A friend of a friend ran Softer on 2.6, and all I ever heard
back about it was that Softer says "unknown error," which doesn't tell me
much. (Just that the EAX error code wasn't one that's regdump.asm, and
it's got them all up to #124, so it must be a new 2.6 error code.) I
tried to get the friend to get the other friend to get me the full
debugging output, but somehow all I ever got back from that was "EAX has
some numbers and a lot of zeros."
However, this all might be a bit pointless. It occured to me that slower
machines might not be able to write the whole palette before vertical
retrace ends. It looks like my other computer doesn't completely get the
palette changed until half-way through the first scanline of the picture.
Maybe changing the palette every frame is trying to do too much.
I bumped into another problem. When testing that on the other computer,
Softer started saying "stdin and stdout must refer to a console TTY." So
I made it so that when it gets that error, it puts the r_dev field of stat
into eax and ebx and calls the register dump code. For some reason the
kernel was giving it (3,224) for stdin and (3,217) for stdout. For
console TTYs, the last number is between 1 and 63, and softer only accepts
1 through 12 because Slackware by default has 666 permissions on the
others, which lets a non-in-front-of-the-monitor user start Softer, which
is a bad thing. 224 is /dev/ttyd0 and 217 is /dev/ttyc9, I don't even
know what those are supposed to be. I tried it on another console, and
then it returned (0,0) (regular file) for stdin and something else for
stdout. I had to reboot Linux to get it to quit doing that. I tried
doing again what I did before to see if it would start doing it again, but
it wouldn't. The never-ending fun of Linux.
^ permalink raw reply [flat|nested] 10+ messages in thread
* video sync: result of 2.6 kernel experimenting
2005-08-30 20:24 ` Richard Cooper
@ 2005-08-31 0:51 ` Richard Cooper
2005-08-31 3:58 ` Stephen Ray
0 siblings, 1 reply; 10+ messages in thread
From: Richard Cooper @ 2005-08-31 0:51 UTC (permalink / raw)
To: linux-assembly
Vsync on 2.6 seems to work really well.
I downloaded 2.6.7 from slackware.com. For some reason, after printing "BIOS data check sucessful" (or something like that) it doesn't do anything at all for 30 seconds. I was about to give up and hit reset, but then it started going.
I ran Softer, it didn't give me any error messages, so I don't know what that guy's problem could have been. It worked just fine for me. May only happen on a specific 2.6 version, or maybe he deleted "/dev/mem" or something. I dunno.
Anyway, I typed 'set' to see what HZ was set to, it was set to 100, but I figured the environment variable might be wrong. Playing around in /proc/ I found that there was an interrupt going off 1000 times a second, so I figured it was probably HZ=1000.
I ran my test program and it basically worked, it just missed a retrace now and then, but got like 80% of them. It stuck the itimer delay so that it bounced between 15998 and 15999. Curious as to why it was there instead of 16000 and 16001 where the next 1ms boundary is, I did some investigating. It seems 2.6 kernels, although they still schedule to the next clock tick, take into consideration how far into the current tick you are when they round the value up. So when it set the itimer, it was 0.002ms past the last tick, so that was added to the itimer value, and the result rounded up to the next 1ms, making it bounce between 16ms and 17ms. The 2.4 kernel didn't take this into consideration, it would have rounded the itimer value up to the next millisecond (if it were HZ=1000), then wait until the end of the current 1ms interval to start measuring, making 16000 delay for 16998, and
16001 delay for 17998. Basically, it always assumed it was near the end of the current t!
ick
when rounding.
Anyway, attempting to sync the timer to the vertical retrace seemed a bit silly with such a low resolution timer. So I just made it keep the timer at 15000us, which would delay between 15000 and 15999, and just poll from that point on. I also made the script determine how many microseconds it took after the timer went off for the actual retrace to occur, and if it was more than 3333 (20% of a vertical retrace interval), it counted it as a miss. This way if the kernel gave it the signal just a little too late, it would count something like 16000us, and know that it missed a frame. If the kernel was more than 13000us late, then that wouldn't be caught, but since that's 13 timeslices, I figure it wouldn't happen.
So, I tested the thing, running it for 3600 retrace cycles (60 seconds). On an idle system, it missed 2 retraces out of 3600, 0.06%. Then I ran it with "cp -R /usr trash & cat /dev/urandom > /dev/null" running on another console. Even with all of that going on, it still missed only two retraces.
I couldn't figure out a way to get rid of those two misses per minute, but I didn't expect the kernel to do it perfectly anyway, I just expected it to try.
While it's running, it uses 4.7% of the CPU. Since the CPU usage depends on how close the itimer signal is to the actual retrace, the CPU usage should be the same regardless of CPU speed.
If anyone wants to play with the test program, the source is here:
http://xerse.nfshost.com/secret/softer/vsync.tgz
It's set up now for 80x30 text mode's refresh rate of 60 Hz, which will make it miss the retrace every time in 80x25. To use it with 80x25 which runs at 70 Hz, change the itimer delay on line 134 from 15000 to 13000, the 3333 on line 85 to 2857, and the 60 on line 91 to 70.
Also, on 2.4 kernels with HZ=1000, you'll have to subtract 1000 from the itimer delay to correct for rounding differences in the kernel. And it won't work at all if HZ=100.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: video sync: result of 2.6 kernel experimenting
2005-08-31 0:51 ` video sync: result of 2.6 kernel experimenting Richard Cooper
@ 2005-08-31 3:58 ` Stephen Ray
0 siblings, 0 replies; 10+ messages in thread
From: Stephen Ray @ 2005-08-31 3:58 UTC (permalink / raw)
To: Richard Cooper; +Cc: linux-assembly
Richard Cooper wrote:
>
>
> Anyway, I typed 'set' to see what HZ was set to, it was set to 100,
> but I figured the environment variable might be wrong. Playing around
> in /proc/ I found that there was an interrupt going off 1000 times a
> second, so I figured it was probably HZ=1000.
>
My understanding is that HZ is set to 100 in userspace, to avoid
breaking some userspace programs. It's not the same HZ value that is
used in the kernel source in 2.6.
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2005-08-31 3:58 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-08-27 19:28 video sync timing Richard Cooper
2005-08-29 21:25 ` video sync timing + softer update Richard Cooper
2005-08-30 1:40 ` Frank Kotler
2005-08-30 12:40 ` Richard Cooper
2005-08-30 2:54 ` Stephen Ray
2005-08-30 13:44 ` Richard Cooper
2005-08-30 17:36 ` Stephen Ray
2005-08-30 20:24 ` Richard Cooper
2005-08-31 0:51 ` video sync: result of 2.6 kernel experimenting Richard Cooper
2005-08-31 3:58 ` Stephen Ray
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).