summaryrefslogtreecommitdiff
path: root/hw/kdrive/fbdev/fbdev.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2000-09-15 07:25:13 +0000
committerKeith Packard <keithp@keithp.com>2000-09-15 07:25:13 +0000
commitf7421d836186cd6dfb919c5a48d556a68d6c5a5d (patch)
tree8f74c344c6ce8ac15a7c34610d8b4d6cdf08f089 /hw/kdrive/fbdev/fbdev.c
parent5ec29fe9ea788e0dcc47534a2eca479b2c465160 (diff)
Add rotation to fbdev and vesa
Diffstat (limited to 'hw/kdrive/fbdev/fbdev.c')
-rw-r--r--hw/kdrive/fbdev/fbdev.c101
1 files changed, 90 insertions, 11 deletions
diff --git a/hw/kdrive/fbdev/fbdev.c b/hw/kdrive/fbdev/fbdev.c
index a0ac5cf08..a80479b7f 100644
--- a/hw/kdrive/fbdev/fbdev.c
+++ b/hw/kdrive/fbdev/fbdev.c
@@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.c,v 1.4 2000/05/06 22:17:41 keithp Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.c,v 1.5 2000/09/03 05:11:17 keithp Exp $ */
#include "fbdev.h"
@@ -80,19 +80,14 @@ fbdevCardInit (KdCardInfo *card)
}
Bool
-fbdevScreenInit (KdScreenInfo *screen)
+fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv)
{
FbdevPriv *priv = screen->card->driver;
Pixel allbits;
int depth;
+ Bool rotate;
+ Bool shadow;
- screen->width = priv->var.xres;
- screen->height = priv->var.yres;
- screen->fb[0].depth = priv->var.bits_per_pixel;
- screen->fb[0].bitsPerPixel = priv->var.bits_per_pixel;
- screen->fb[0].byteStride = priv->fix.line_length;
- screen->fb[0].pixelStride = (priv->fix.line_length * 8 /
- priv->var.bits_per_pixel);
switch (priv->fix.visual) {
case FB_VISUAL_PSEUDOCOLOR:
screen->fb[0].visuals = ((1 << StaticGray) |
@@ -121,13 +116,84 @@ fbdevScreenInit (KdScreenInfo *screen)
break;
}
screen->rate = 72;
- screen->fb[0].frameBuffer = (CARD8 *) (priv->fb);
+ scrpriv->rotate = ((priv->var.xres < priv->var.yres) !=
+ (screen->width < screen->height));
+ screen->fb[0].depth = priv->var.bits_per_pixel;
+ screen->fb[0].bitsPerPixel = priv->var.bits_per_pixel;
+ if (!scrpriv->rotate)
+ {
+ screen->width = priv->var.xres;
+ screen->height = priv->var.yres;
+ screen->fb[0].byteStride = priv->fix.line_length;
+ screen->fb[0].pixelStride = (priv->fix.line_length * 8 /
+ priv->var.bits_per_pixel);
+ screen->fb[0].frameBuffer = (CARD8 *) (priv->fb);
+ return TRUE;
+ }
+ else
+ {
+ screen->width = priv->var.yres;
+ screen->height = priv->var.xres;
+ screen->softCursor = TRUE;
+ return KdShadowScreenInit (screen);
+ }
+}
+
+Bool
+fbdevScreenInit (KdScreenInfo *screen)
+{
+ FbdevScrPriv *scrpriv;
+
+ scrpriv = xalloc (sizeof (FbdevScrPriv));
+ if (!scrpriv)
+ return FALSE;
+ if (!fbdevScreenInitialize (screen, scrpriv))
+ {
+ xfree (scrpriv);
+ return FALSE;
+ }
+ screen->driver = scrpriv;
return TRUE;
}
+
+void *
+fbdevWindowLinear (ScreenPtr pScreen,
+ CARD32 row,
+ CARD32 offset,
+ int mode,
+ CARD32 *size)
+{
+ KdScreenPriv(pScreen);
+ FbdevPriv *priv = pScreenPriv->card->driver;
+
+ if (!pScreenPriv->enabled)
+ return 0;
+ *size = priv->fix.line_length;
+ return (CARD8 *) priv->fb + row * priv->fix.line_length + offset;
+}
Bool
fbdevInitScreen (ScreenPtr pScreen)
{
+ KdScreenPriv(pScreen);
+ FbdevPriv *priv = pScreenPriv->card->driver;
+ FbdevScrPriv *scrpriv = pScreenPriv->screen->driver;
+ ShadowUpdateProc update;
+ ShadowWindowProc window;
+
+ if (scrpriv->rotate)
+ {
+ window = fbdevWindowLinear;
+ switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
+ case 8:
+ update = shadowUpdateRotate8; break;
+ case 16:
+ update = shadowUpdateRotate16; break;
+ case 32:
+ update = shadowUpdateRotate32; break;
+ }
+ return KdShadowInitScreen (pScreen, update, window);
+ }
return TRUE;
}
@@ -141,7 +207,9 @@ fbdevEnable (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
FbdevPriv *priv = pScreenPriv->card->driver;
- int k;
+ FbdevScrPriv *scrpriv = pScreenPriv->screen->driver;
+ int k;
+ KdMouseMatrix m;
priv->var.activate = FB_ACTIVATE_NOW|FB_CHANGE_CMAP_VBL;
@@ -152,6 +220,17 @@ fbdevEnable (ScreenPtr pScreen)
perror ("FBIOPUT_VSCREENINFO");
return FALSE;
}
+ if (scrpriv->rotate)
+ {
+ m.matrix[0][0] = 0; m.matrix[0][1] = 1; m.matrix[0][2] = 0;
+ m.matrix[1][0] = -1; m.matrix[1][1] = 0; m.matrix[1][2] = pScreen->height - 1;
+ }
+ else
+ {
+ m.matrix[0][0] = 1; m.matrix[0][1] = 0; m.matrix[0][2] = 0;
+ m.matrix[1][0] = 0; m.matrix[1][1] = 1; m.matrix[1][2] = 0;
+ }
+ KdSetMouseMatrix (&m);
return TRUE;
}