Hi
Working on my ViRGE driver, I noticed something:
Handling the KGI commands, most drivers use a switch () {case ...}
structure. This looks nice, but results in very slow code (each case
results in at least one conditional jump, which can slow down the CPU
badly)
I was wondering: Using a procedure lookup table would improve the speed a
lot, but would require that I can take the definitions in kgi_commands.h
as static ones. It would result in code like (this is no real code,
only to make things clear)
int * accelleration_command[](void *, struct kgi_display)= {
ViRGE_2D_DrawLine, /* This depends on kgi_commands.h */
ViRGE_2D_DrawBox,
... etc...
}
(*accelleration_command[_IOC_NR(cmd)])(gr->io_buf,gr->dev.dpy);
instead of :
switch (cmd) {
case ACCEL_DRAW_LINE:
case ....
case ....
}
Notes here: _IOC_NR is Linux only and must be replaced by a KGI defined
compatible function. I use _IOC_NR to get values in the range 0-255,
otherwise the table would become very huge with many unused entries.
Comments please...
Jos