I've implemented rotation and reflection support in the core XFree86 server; it was less invasive than I'd feared and seems to work just fine.
For most devices, it does it's work by substituting a whole new rendering mechanism based on the shadow frame buffer when the screen is rotated or reflected. Right now, this means that video and DRI won't work right if the screen is rotated; they'll hit the regular frame buffer and mangle things badly. It also permits drivers to support rotation themselves as the siliconmotion hardware seems capable of. It's possible to provide video support in this rotated world; I've implemented that for the Mach64 chipset in Tiny-X (mostly because I could), we could do that for the regular XFree86 servers too with some additional work. On the other hand, DRI probably won't ever work on a rotated screen; you'd have to transmit the rotation information to the application and let them convert transformation matrices and clip lists. That'd be a real adventure. I haven't yet committed the changes to CVS as I'm curious of two things: 1) It hooks into some seemingly silly places -- it needs two initialization steps, one right before acceleration is pushed on top of fb and another right before the software cursor is pushed on top of the acceleration. The first is done by sticking a call inside xf86SetBackingStore, the second by placing a call inside xf86GetPointerScreenFuncs. Those two functions happen to need to be called at precisely the same moment as the RandR hooks, but are obviously not exactly semantically intended for this purpose. The alternative is to require every driver to add calls to RandR, which I'll do if people think it's the right think to do. 2) Permitting rotation incurs an additional layer along several paths inside the X server -- the usual rendering paths all need to get redirected when the system switches from hardware to software rendering, so the screen functions CreateGC, PaintWindow* and the like all get wrapped by the layer module. This new layer is implemented by the 'layer' and 'shadow' modules, both of which must be loaded when the server starts for rotation to ever be possible. It seems reasonable, therefore, that this dynamic rotation mechanism should be selectable. Should I add an option to enable or disable this? Should it be disabled by default? Keith Packard XFree86 Core Team HP Cambridge Research Lab _______________________________________________ Xpert mailing list [EMAIL PROTECTED] http://XFree86.Org/mailman/listinfo/xpert