Hi Kevin et al.,
The idea of a single set of graphical primitives is neat, but not
necessarily a good approach for proprietary graphic systems like DirectX
because they're so damned, well, proprietary. If you want 3D performance on
Windows, you need an efficient way to translate DirectX to HARDWARE
ACCELERATED drawing instructions on the host. For all practical purposes on
Linux and Unices, that means OpenGL (Note, SDL 1.1 implements the OpenGL
API, so I'm not brushing off SDL, for those who care :-). Of course, you may
not care about 3D performance, but I'm sure someone will - and I'm sure,
because I'm one if no one else is.
Just as a "heads-up", on windows at least, you won't necessarily get a
choice of ring when implementing a driver. They run in the ring that windows
wants them to, and that's that. It's always the same for a particular entry
point/module, but the windows architecture determines the ring, not the
driver writer.
On a slightly divergent topic, the whole range of accelerated guest drivers
are going to need a way to communicate with the host, and vice-versa. The
method will need to handle the transfer of data in both directions,
perferably by remapping Guest memory, not by copying (copying of data is
DEATH to performance). It must be efficient and potentially asynchronous
from the host to the guest - which I guess just means we have to emulate a
hardware interrupt. We need some sort of invokation that does not occur in
an actual guest - maybe an illegal instruction? (A real use for 0xF0 0F
after all this time?). Also a standard means of transferring information.
Maybe a variable sized parameter block with a standard header? A pointer
could be placed on the stack or embedded immediately after the trigger or
put in a register, or whatever is most efficient. Does such a mechanism
exist already, or do we need to invent it?
Totally OT, I just put a 256 meg drive in my system as a second drive. Now
all I need is internet access (read firewall and home LAN) and some time...