Allow for hardware acceleration under RandR with Layer. Hardware/Software

cursor switching still busted
This commit is contained in:
Keith Packard 2001-06-04 09:45:42 +00:00
parent 54e66d92db
commit 7fcf46356b
11 changed files with 544 additions and 291 deletions

View File

@ -19,7 +19,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64.c,v 1.16 2001/03/21 16:43:16 dawes Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64.c,v 1.1 2001/06/03 18:48:19 keithp Exp $ */
#include "mach64.h" #include "mach64.h"
#include <sys/io.h> #include <sys/io.h>
@ -108,6 +108,42 @@ mach64InitScreen (ScreenPtr pScreen)
return vesaInitScreen (pScreen); return vesaInitScreen (pScreen);
} }
#ifdef RANDR
mach64RandRSetConfig (ScreenPtr pScreen,
Rotation rotation,
RRScreenSizePtr pSize,
RRVisualGroupPtr pVisualGroup)
{
KdScreenPriv(pScreen);
KdCheckSync (pScreen);
if (!vesaRandRSetConfig (pScreen, rotation, pSize, pVisualGroup))
return FALSE;
return TRUE;
}
void
mach64RandRInit (ScreenPtr pScreen)
{
rrScrPriv(pScreen);
pScrPriv->rrSetConfig = mach64RandRSetConfig;
}
#endif
Bool
mach64FinishInitScreen (ScreenPtr pScreen)
{
Bool ret;
ret = vesaFinishInitScreen (pScreen);
#ifdef RANDR
mach64RandRInit (pScreen);
#endif
return ret;
}
CARD32 CARD32
mach64ReadLCD (Reg *reg, int id) mach64ReadLCD (Reg *reg, int id)
{ {
@ -328,4 +364,6 @@ KdCardFuncs mach64Funcs = {
vesaGetColors, /* getColors */ vesaGetColors, /* getColors */
vesaPutColors, /* putColors */ vesaPutColors, /* putColors */
mach64FinishInitScreen, /* finishInitScreen */
}; };

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64.h,v 1.9 2000/11/29 08:42:25 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64.h,v 1.1 2001/06/03 18:48:19 keithp Exp $ */
#ifndef _MACH64_H_ #ifndef _MACH64_H_
#define _MACH64_H_ #define _MACH64_H_
@ -481,9 +481,15 @@ mach64ReadLCD (Reg *reg, int id);
void void
mach64WriteLCD (Reg *reg, int id, CARD32 data); mach64WriteLCD (Reg *reg, int id, CARD32 data);
Bool
mach64DrawSetup (ScreenPtr pScreen);
Bool Bool
mach64DrawInit (ScreenPtr pScreen); mach64DrawInit (ScreenPtr pScreen);
void
mach64DrawReinit (ScreenPtr pScreen);
void void
mach64DrawEnable (ScreenPtr pScreen); mach64DrawEnable (ScreenPtr pScreen);

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64draw.c,v 1.9 2001/05/30 15:36:25 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64draw.c,v 1.1 2001/06/03 18:48:19 keithp Exp $ */
#include "mach64.h" #include "mach64.h"
#include "mach64draw.h" #include "mach64draw.h"
@ -227,6 +227,20 @@ KaaScreenPrivRec mach64Kaa = {
mach64DoneCopy, mach64DoneCopy,
}; };
Bool
mach64DrawInit (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
if (pScreenPriv->screen->fb[0].depth == 4)
return FALSE;
if (!kaaDrawInit (pScreen, &mach64Kaa))
return FALSE;
return TRUE;
}
#define PIX_FORMAT_MONO 0 #define PIX_FORMAT_MONO 0
#define PIX_FORMAT_PSEUDO_8 2 #define PIX_FORMAT_PSEUDO_8 2
#define PIX_FORMAT_TRUE_1555 3 #define PIX_FORMAT_TRUE_1555 3
@ -238,7 +252,8 @@ KaaScreenPrivRec mach64Kaa = {
#define PIX_FORMAT_YUV_444 0xe #define PIX_FORMAT_YUV_444 0xe
#define PIX_FORMAT_TRUE_4444 0xf #define PIX_FORMAT_TRUE_4444 0xf
mach64DrawInit (ScreenPtr pScreen) void
mach64DrawEnable (ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
mach64ScreenInfo(pScreenPriv); mach64ScreenInfo(pScreenPriv);
@ -266,7 +281,7 @@ mach64DrawInit (ScreenPtr pScreen)
SET_DP_DST_PIX_WIDTH = PIX_FORMAT_MONO; SET_DP_DST_PIX_WIDTH = PIX_FORMAT_MONO;
break; break;
case 4: case 4:
return FALSE; FatalError ("mach64 can't accelerate 4bpp");
break; break;
case 8: case 8:
DP_PIX_WIDTH = ((PIX_FORMAT_PSEUDO_8 << 0) | /* DP_DST_PIX_WIDTH */ DP_PIX_WIDTH = ((PIX_FORMAT_PSEUDO_8 << 0) | /* DP_DST_PIX_WIDTH */
@ -355,9 +370,6 @@ mach64DrawInit (ScreenPtr pScreen)
break; break;
} }
if (!kaaDrawInit (pScreen, &mach64Kaa))
return FALSE;
mach64s->DP_PIX_WIDTH = DP_PIX_WIDTH; mach64s->DP_PIX_WIDTH = DP_PIX_WIDTH;
DST1_PITCH = (pScreenPriv->screen->fb[0].pixelStride) >> 3; DST1_PITCH = (pScreenPriv->screen->fb[0].pixelStride) >> 3;
if (mach64s->bpp24) if (mach64s->bpp24)
@ -380,12 +392,6 @@ mach64DrawInit (ScreenPtr pScreen)
(0 << 29) | /* FAST_FILL_EN */ (0 << 29) | /* FAST_FILL_EN */
(0 << 30) | /* BLOCK_WRITE_EN */ (0 << 30) | /* BLOCK_WRITE_EN */
0); 0);
return TRUE;
}
void
mach64DrawEnable (ScreenPtr pScreen)
{
KdMarkSync (pScreen); KdMarkSync (pScreen);
} }

View File

@ -1,5 +1,5 @@
/* /*
* $XFree86: xc/programs/Xserver/hw/kdrive/kaa.c,v 1.2 2001/05/30 15:36:25 keithp Exp $ * $XFree86: xc/programs/Xserver/hw/kdrive/kaa.c,v 1.3 2001/06/03 18:48:19 keithp Exp $
* *
* Copyright © 2001 Keith Packard, member of The XFree86 Project, Inc. * Copyright © 2001 Keith Packard, member of The XFree86 Project, Inc.
* *
@ -503,9 +503,8 @@ kaaCreateGC (GCPtr pGC)
if (!fbCreateGC (pGC)) if (!fbCreateGC (pGC))
return FALSE; return FALSE;
if (pGC->depth != 1) pGC->funcs = &kaaGCFuncs;
pGC->funcs = &kaaGCFuncs;
return TRUE; return TRUE;
} }
@ -556,8 +555,11 @@ kaaFillRegionSolid (DrawablePtr pDrawable,
KdMarkSync(pDrawable->pScreen); KdMarkSync(pDrawable->pScreen);
} }
else else
{
KdCheckSync (pDrawable->pScreen);
fbFillRegionSolid (pDrawable, pRegion, 0, fbFillRegionSolid (pDrawable, pRegion, 0,
fbReplicatePixel (pixel, pDrawable->bitsPerPixel)); fbReplicatePixel (pixel, pDrawable->bitsPerPixel));
}
} }
void void

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/kasync.c,v 1.7 2000/09/22 06:25:29 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/kasync.c,v 1.8 2001/03/30 02:15:19 keithp Exp $ */
#include "kdrive.h" #include "kdrive.h"
@ -60,7 +60,8 @@ RegionPtr
KdCheckCopyArea (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, KdCheckCopyArea (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
int srcx, int srcy, int w, int h, int dstx, int dsty) int srcx, int srcy, int w, int h, int dstx, int dsty)
{ {
KdCheckSync (pSrc->pScreen); if (pSrc->type == DRAWABLE_WINDOW || pDst->type == DRAWABLE_WINDOW)
KdCheckSync (pSrc->pScreen);
return fbCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty); return fbCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty);
} }
@ -69,7 +70,8 @@ KdCheckCopyPlane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
int srcx, int srcy, int w, int h, int dstx, int dsty, int srcx, int srcy, int w, int h, int dstx, int dsty,
unsigned long bitPlane) unsigned long bitPlane)
{ {
KdCheckSync (pSrc->pScreen); if (pSrc->type == DRAWABLE_WINDOW || pDst->type == DRAWABLE_WINDOW)
KdCheckSync (pSrc->pScreen);
return fbCopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty, return fbCopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty,
bitPlane); bitPlane);
} }

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.c,v 1.14 2001/05/26 01:25:41 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.c,v 1.15 2001/05/29 04:54:10 keithp Exp $ */
#include "kdrive.h" #include "kdrive.h"
#ifdef PSEUDO8 #ifdef PSEUDO8
@ -744,8 +744,12 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
*/ */
if (screen->width_mm) if (screen->width_mm)
pScreen->mmWidth = screen->width_mm; pScreen->mmWidth = screen->width_mm;
else
screen->width_mm = pScreen->mmWidth;
if (screen->height_mm) if (screen->height_mm)
pScreen->mmHeight = screen->height_mm; pScreen->mmHeight = screen->height_mm;
else
screen->height_mm = pScreen->mmHeight;
/* /*
* Plug in our own block/wakeup handlers. * Plug in our own block/wakeup handlers.
@ -758,11 +762,6 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
if (!fbPictureInit (pScreen, 0, 0)) if (!fbPictureInit (pScreen, 0, 0))
return FALSE; return FALSE;
#endif #endif
#ifdef RANDR
if (!miRandRInit (pScreen))
return FALSE;
#endif
if (card->cfuncs->initScreen) if (card->cfuncs->initScreen)
if (!(*card->cfuncs->initScreen) (pScreen)) if (!(*card->cfuncs->initScreen) (pScreen))
return FALSE; return FALSE;
@ -775,6 +774,10 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
(void) p8Init (pScreen, PSEUDO8_USE_DEFAULT); (void) p8Init (pScreen, PSEUDO8_USE_DEFAULT);
#endif #endif
if (card->cfuncs->finishInitScreen)
if (!(*card->cfuncs->finishInitScreen) (pScreen))
return FALSE;
#if 0 #if 0
fbInitValidateTree (pScreen); fbInitValidateTree (pScreen);
#endif #endif

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.h,v 1.12 2000/12/08 22:59:37 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.h,v 1.14 2001/05/29 04:54:10 keithp Exp $ */
#include <stdio.h> #include <stdio.h>
#include "X.h" #include "X.h"
@ -140,6 +140,8 @@ typedef struct _KdCardFuncs {
void (*getColors) (ScreenPtr, int, int, xColorItem *); void (*getColors) (ScreenPtr, int, int, xColorItem *);
void (*putColors) (ScreenPtr, int, int, xColorItem *); void (*putColors) (ScreenPtr, int, int, xColorItem *);
Bool (*finishInitScreen) (ScreenPtr pScreen);
} KdCardFuncs; } KdCardFuncs;
#define KD_MAX_PSEUDO_DEPTH 8 #define KD_MAX_PSEUDO_DEPTH 8
@ -291,6 +293,17 @@ extern KdOsFuncs *kdOsFuncs;
#define KdMarkSync(s) (KdGetScreenPriv(s)->card->needSync = TRUE) #define KdMarkSync(s) (KdGetScreenPriv(s)->card->needSync = TRUE)
/* kaa.c */
Bool
kaaDrawInit (ScreenPtr pScreen,
KaaScreenPrivPtr pScreenPriv);
void
kaaWrapGC (GCPtr pGC);
void
kaaUnwrapGC (GCPtr pGC);
/* kasync.c */ /* kasync.c */
void void
KdCheckFillSpans (DrawablePtr pDrawable, GCPtr pGC, int nspans, KdCheckFillSpans (DrawablePtr pDrawable, GCPtr pGC, int nspans,

View File

@ -19,7 +19,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.c,v 1.16 2001/03/21 16:43:16 dawes Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.c,v 1.17 2001/06/03 18:48:19 keithp Exp $ */
#include "trident.h" #include "trident.h"
#include <sys/io.h> #include <sys/io.h>
@ -155,6 +155,14 @@ tridentInitScreen (ScreenPtr pScreen)
#endif #endif
} }
Bool
tridentFinishInitScreen (ScreenPtr pScreen)
{
#ifdef VESA
return vesaFinishInitScreen (pScreen);
#endif
}
CARD8 CARD8
tridentReadIndex (TridentCardInfo *tridentc, CARD16 port, CARD8 index) tridentReadIndex (TridentCardInfo *tridentc, CARD16 port, CARD8 index)
{ {
@ -598,4 +606,5 @@ KdCardFuncs tridentFuncs = {
fbdevGetColors, /* getColors */ fbdevGetColors, /* getColors */
fbdevPutColors, /* putColors */ fbdevPutColors, /* putColors */
#endif #endif
tridentFinishInitScreen /* finishInitScreen */
}; };

View File

@ -19,7 +19,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.c,v 1.11 2001/05/29 04:54:12 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.c,v 1.12 2001/06/03 21:52:46 keithp Exp $ */
#include "vesa.h" #include "vesa.h"
#ifdef RANDR #ifdef RANDR
@ -37,8 +37,8 @@ Bool vesa_verbose = FALSE;
#define VesaPriv(scr) ((VesaScreenPrivPtr) (scr)->driver) #define VesaPriv(scr) ((VesaScreenPrivPtr) (scr)->driver)
#define ScreenRotated(scr) (VesaPriv(scr)->rotate == 90 || VesaPriv(scr)->rotate == 270) #define ScreenRotated(scr) (VesaPriv(scr)->rotate == 90 || VesaPriv(scr)->rotate == 270)
#define vesaWidth(scr,vmib) (ScreenRotated(scr) ? vmib->YResolution : vmib->XResolution) #define vesaWidth(scr,vmib) (ScreenRotated(scr) ? (vmib)->YResolution : (vmib)->XResolution)
#define vesaHeight(scr,vmib) (ScreenRotated(scr) ? vmib->XResolution : vmib->YResolution) #define vesaHeight(scr,vmib) (ScreenRotated(scr) ? (vmib)->XResolution : (vmib)->YResolution)
static Bool static Bool
vesaModeSupportable (VesaModePtr mode, Bool complain) vesaModeSupportable (VesaModePtr mode, Bool complain)
@ -370,8 +370,6 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
VesaCardPrivPtr priv = screen->card->driver; VesaCardPrivPtr priv = screen->card->driver;
VesaModePtr mode; VesaModePtr mode;
Pixel allbits; Pixel allbits;
int depth;
int bpp, fbbpp;
screen->driver = pscr; screen->driver = pscr;
@ -406,29 +404,11 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
pscr->rotate = screen->rotation; pscr->rotate = screen->rotation;
pscr->shadow = vesa_shadow; pscr->shadow = vesa_shadow;
pscr->origDepth = screen->fb[0].depth; pscr->origDepth = screen->fb[0].depth;
pscr->layerKind = LAYER_FB;
if (vesa_linear_fb) /*
pscr->mapping = VESA_LINEAR; * Compute visual support for the selected depth
else */
pscr->mapping = VESA_WINDOWED;
depth = vesaDepth (&pscr->mode);
bpp = pscr->mode.BitsPerPixel;
if (bpp > 24)
bpp = 32;
else if (bpp > 16)
bpp = 24;
else if (bpp > 8)
bpp = 16;
else if (bpp > 4)
bpp = 8;
else if (bpp > 1)
bpp = 4;
else
bpp = 1;
fbbpp = bpp;
switch (pscr->mode.MemoryModel) { switch (pscr->mode.MemoryModel) {
case MEMORY_DIRECT: case MEMORY_DIRECT:
/* TrueColor or DirectColor */ /* TrueColor or DirectColor */
@ -439,19 +419,6 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
FbStipMask(pscr->mode.GreenFieldPosition, pscr->mode.GreenMaskSize); FbStipMask(pscr->mode.GreenFieldPosition, pscr->mode.GreenMaskSize);
screen->fb[0].blueMask = screen->fb[0].blueMask =
FbStipMask(pscr->mode.BlueFieldPosition, pscr->mode.BlueMaskSize); FbStipMask(pscr->mode.BlueFieldPosition, pscr->mode.BlueMaskSize);
allbits =
screen->fb[0].redMask |
screen->fb[0].greenMask |
screen->fb[0].blueMask;
depth = 32;
while (depth && !(allbits & (1 << (depth - 1))))
depth--;
if (vesa_verbose)
ErrorF ("\tTrue Color bpp %d depth %d red 0x%x green 0x%x blue 0x%x\n",
bpp, depth,
screen->fb[0].redMask,
screen->fb[0].greenMask,
screen->fb[0].blueMask);
break; break;
case MEMORY_PSEUDO: case MEMORY_PSEUDO:
/* PseudoColor */ /* PseudoColor */
@ -464,9 +431,6 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
screen->fb[0].blueMask = 0x00; screen->fb[0].blueMask = 0x00;
screen->fb[0].greenMask = 0x00; screen->fb[0].greenMask = 0x00;
screen->fb[0].redMask = 0x00; screen->fb[0].redMask = 0x00;
if (vesa_verbose)
ErrorF ("\tPseudo Color bpp %d depth %d\n",
bpp, depth);
break; break;
case MEMORY_PLANAR: case MEMORY_PLANAR:
/* 4 plane planar */ /* 4 plane planar */
@ -477,94 +441,15 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
screen->fb[0].blueMask = 0x00; screen->fb[0].blueMask = 0x00;
screen->fb[0].greenMask = 0x00; screen->fb[0].greenMask = 0x00;
screen->fb[0].redMask = 0x00; screen->fb[0].redMask = 0x00;
if (bpp == 4)
{
bpp = screen->fb[0].bitsPerPixel;
if (bpp != 8)
bpp = 4;
depth = bpp;
}
if (bpp == 1)
{
pscr->mapping = VESA_MONO;
if (vesa_verbose)
ErrorF ("\tMonochrome\n");
}
else
{
pscr->mapping = VESA_PLANAR;
if (vesa_verbose)
ErrorF ("\tStatic color bpp %d depth %d\n",
bpp, depth);
}
pscr->rotate = 0;
break; break;
default: default:
ErrorF("Unsupported VESA MemoryModel 0x%02X\n", ErrorF("Unsupported VESA MemoryModel 0x%02X\n",
pscr->mode.MemoryModel); pscr->mode.MemoryModel);
return FALSE; return FALSE;
} }
switch (fbbpp) {
case 8:
case 16:
case 32:
break;
default:
pscr->rotate = 0;
}
screen->width = vesaWidth(screen, mode);
screen->height = vesaHeight(screen, mode);
screen->fb[0].depth = depth;
screen->fb[0].bitsPerPixel = bpp;
screen->fb[0].byteStride = pscr->mode.BytesPerScanLine;
screen->fb[0].pixelStride = ((pscr->mode.BytesPerScanLine * 8) / fbbpp);
if (pscr->mapping == VESA_LINEAR && !(pscr->mode.ModeAttributes & MODE_LINEAR))
pscr->mapping = VESA_WINDOWED;
if (pscr->rotate)
pscr->shadow = TRUE;
switch (pscr->mapping) {
case VESA_MONO:
pscr->shadow = TRUE;
/* fall through */
case VESA_LINEAR:
if (pscr->mode.vbe)
pscr->fb = VbeMapFramebuffer(priv->vi, priv->vbeInfo,
pscr->mode.mode,
&pscr->fb_size);
else
pscr->fb = VgaMapFramebuffer (priv->vi,
pscr->mode.mode,
&pscr->fb_size);
break;
case VESA_WINDOWED:
pscr->fb = NULL;
pscr->shadow = TRUE;
break;
case VESA_PLANAR:
pscr->fb = NULL;
pscr->shadow = TRUE;
break;
}
screen->rate = 72; screen->rate = 72;
screen->fb[0].frameBuffer = (CARD8 *)(pscr->fb);
if (pscr->rotate) return vesaMapFramebuffer (screen);
screen->softCursor = TRUE;
if (pscr->shadow)
return KdShadowScreenInit (screen);
if (vesa_verbose)
ErrorF ("Mode selected %dx%dx%d\n",
screen->width, screen->height, screen->fb[0].depth);
return TRUE;
} }
Bool Bool
@ -850,6 +735,248 @@ vesaCreateColormap16 (ColormapPtr pmap)
return TRUE; return TRUE;
} }
LayerPtr
vesaLayerCreate (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
KdScreenInfo *screen = pScreenPriv->screen;
VesaCardPrivPtr priv = pScreenPriv->card->driver;
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
LayerPtr pLayer;
ShadowUpdateProc update;
ShadowWindowProc window;
PixmapPtr pPixmap;
int kind;
if (pscr->shadow)
{
switch (pscr->mapping) {
case VESA_LINEAR:
update = shadowUpdatePacked;
window = vesaWindowLinear;
break;
case VESA_WINDOWED:
update = shadowUpdatePacked;
window = vesaWindowWindowed;
break;
case VESA_PLANAR:
pScreen->CreateColormap = vesaCreateColormap16;
if (pScreenPriv->screen->fb[0].bitsPerPixel == 8)
update = shadowUpdatePlanar4x8;
else
update = shadowUpdatePlanar4;
window = vesaWindowPlanar;
pscr->rotate = 0;
break;
case VESA_MONO:
update = vesaUpdateMono;
if (pscr->mode.mode < 8)
window = vesaWindowCga;
else
window = vesaWindowLinear;
pscr->rotate = 0;
break;
}
switch (pscr->rotate) {
case 90:
switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
case 8:
update = shadowUpdateRotate8_90; break;
case 16:
update = shadowUpdateRotate16_90; break;
case 32:
update = shadowUpdateRotate32_90; break;
}
break;
case 180:
switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
case 8:
update = shadowUpdateRotate8_180; break;
case 16:
update = shadowUpdateRotate16_180; break;
case 32:
update = shadowUpdateRotate32_180; break;
}
break;
case 270:
switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
case 8:
update = shadowUpdateRotate8_270; break;
case 16:
update = shadowUpdateRotate16_270; break;
case 32:
update = shadowUpdateRotate32_270; break;
}
break;
}
kind = LAYER_SHADOW;
pPixmap = 0;
}
else
{
kind = pscr->layerKind;
pPixmap = LAYER_SCREEN_PIXMAP;
update = 0;
window = 0;
}
if (vesa_verbose)
ErrorF ("Mode selected %dx%dx%d\n",
screen->width, screen->height, screen->fb[0].depth);
return LayerCreate (pScreen, kind, screen->fb[0].depth,
pPixmap, update, window, 0);
}
Bool
vesaMapFramebuffer (KdScreenInfo *screen)
{
VesaCardPrivPtr priv = screen->card->driver;
VesaScreenPrivPtr pscr = screen->driver;
int depth, bpp, fbbpp;
Pixel allbits;
if (vesa_linear_fb)
pscr->mapping = VESA_LINEAR;
else
pscr->mapping = VESA_WINDOWED;
depth = vesaDepth (&pscr->mode);
bpp = pscr->mode.BitsPerPixel;
if (bpp > 24)
bpp = 32;
else if (bpp > 16)
bpp = 24;
else if (bpp > 8)
bpp = 16;
else if (bpp > 4)
bpp = 8;
else if (bpp > 1)
bpp = 4;
else
bpp = 1;
fbbpp = bpp;
switch (pscr->mode.MemoryModel) {
case MEMORY_DIRECT:
allbits = (screen->fb[0].redMask |
screen->fb[0].greenMask |
screen->fb[0].blueMask);
depth = 32;
while (depth && !(allbits & (1 << (depth - 1))))
depth--;
if (vesa_verbose)
ErrorF ("\tTrue Color red 0x%x green 0x%x blue 0x%x\n",
bpp, depth,
screen->fb[0].redMask,
screen->fb[0].greenMask,
screen->fb[0].blueMask);
break;
case MEMORY_PSEUDO:
if (vesa_verbose)
ErrorF ("\tPseudo Color bpp %d depth %d\n",
bpp, depth);
break;
case MEMORY_PLANAR:
if (bpp == 4)
{
bpp = screen->fb[0].bitsPerPixel;
if (bpp != 8)
bpp = 4;
depth = bpp;
}
if (bpp == 1)
{
pscr->mapping = VESA_MONO;
if (vesa_verbose)
ErrorF ("\tMonochrome\n");
}
else
{
pscr->mapping = VESA_PLANAR;
if (vesa_verbose)
ErrorF ("\tStatic color bpp %d depth %d\n",
bpp, depth);
}
pscr->rotate = 0;
break;
default:
return 0;
}
switch (fbbpp) {
case 8:
case 16:
case 32:
break;
default:
pscr->rotate = 0;
}
screen->width = vesaWidth(screen, &pscr->mode);
screen->height = vesaHeight(screen, &pscr->mode);
screen->fb[0].depth = depth;
screen->fb[0].bitsPerPixel = bpp;
screen->fb[0].byteStride = pscr->mode.BytesPerScanLine;
screen->fb[0].pixelStride = ((pscr->mode.BytesPerScanLine * 8) / fbbpp);
if (pscr->mapping == VESA_LINEAR && !(pscr->mode.ModeAttributes & MODE_LINEAR))
pscr->mapping = VESA_WINDOWED;
pscr->shadow = vesa_shadow;
if (pscr->rotate)
pscr->shadow = TRUE;
if (pscr->rotate)
screen->softCursor = TRUE;
switch (pscr->mapping) {
case VESA_MONO:
pscr->shadow = TRUE;
/* fall through */
case VESA_LINEAR:
if (pscr->mode.vbe)
pscr->fb = VbeMapFramebuffer(priv->vi, priv->vbeInfo,
pscr->mode.mode,
&pscr->fb_size);
else
pscr->fb = VgaMapFramebuffer (priv->vi,
pscr->mode.mode,
&pscr->fb_size);
if (!pscr->fb)
return FALSE;
break;
case VESA_WINDOWED:
pscr->fb = NULL;
pscr->shadow = TRUE;
break;
case VESA_PLANAR:
pscr->fb = NULL;
pscr->shadow = TRUE;
break;
}
screen->fb[0].frameBuffer = (CARD8 *)(pscr->fb);
return TRUE;
}
void
vesaUnmapFramebuffer (KdScreenInfo *screen)
{
VesaCardPrivPtr priv = screen->card->driver;
VesaScreenPrivPtr pscr = screen->driver;
if (pscr->fb)
{
if (pscr->mode.vbe)
VbeUnmapFramebuffer(priv->vi, priv->vbeInfo, pscr->mode.mode, pscr->fb);
else
VgaUnmapFramebuffer (priv->vi);
}
}
#ifdef RANDR #ifdef RANDR
Bool Bool
vesaRandRGetInfo (ScreenPtr pScreen, Rotation *rotations) vesaRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
@ -939,8 +1066,8 @@ vesaRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
pSize = RRRegisterSize (pScreen, pSize = RRRegisterSize (pScreen,
mode->XResolution, mode->XResolution,
mode->YResolution, mode->YResolution,
pScreen->mmWidth, screen->width_mm,
pScreen->mmHeight, screen->height_mm,
pGroupOfVisualGroup); pGroupOfVisualGroup);
if (mode->XResolution == pScreen->width && if (mode->XResolution == pScreen->width &&
mode->YResolution == pScreen->height) mode->YResolution == pScreen->height)
@ -951,6 +1078,30 @@ vesaRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
} }
} }
} }
return TRUE;
}
int
vesaLayerAdd (WindowPtr pWin, pointer value)
{
ScreenPtr pScreen = pWin->drawable.pScreen;
LayerPtr pLayer = (LayerPtr) value;
if (!LayerWindowAdd (pScreen, pLayer, pWin))
return WT_STOPWALKING;
return WT_WALKCHILDREN;
}
int
vesaLayerRemove (WindowPtr pWin, pointer value)
{
ScreenPtr pScreen = pWin->drawable.pScreen;
LayerPtr pLayer = (LayerPtr) value;
LayerWindowRemove (pScreen, pLayer, pWin);
return WT_WALKCHILDREN;
} }
Bool Bool
@ -966,7 +1117,13 @@ vesaRandRSetConfig (ScreenPtr pScreen,
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver; VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
int n; int n;
Bool wasEnabled = pScreenPriv->enabled; Bool wasEnabled = pScreenPriv->enabled;
Bool ret; Bool ret = FALSE;
VesaScreenPrivRec oldscr;
int oldwidth;
int oldheight;
int oldmmwidth;
int oldmmheight;
LayerPtr pNewLayer;
for (n = 0; n < priv->nmode; n++) for (n = 0; n < priv->nmode; n++)
{ {
@ -990,87 +1147,144 @@ vesaRandRSetConfig (ScreenPtr pScreen,
} }
} }
if (n == priv->nmode) if (n == priv->nmode)
return FALSE; goto bail0;
if (wasEnabled) if (wasEnabled)
KdDisableScreen (pScreen); KdDisableScreen (pScreen);
ret = vesaSetMode (pScreen, mode); ret = vesaSetMode (pScreen, mode);
if (ret)
if (!ret)
goto bail1;
oldscr = *pscr;
oldwidth = screen->width;
oldheight = screen->height;
oldmmwidth = pScreen->mmWidth;
oldmmheight = pScreen->mmHeight;
/*
* Set new configuration
*/
pscr->mode = *mode;
switch (rotation) {
case RR_Rotate_0: pscr->rotate = 0; break;
case RR_Rotate_90: pscr->rotate = 90; break;
case RR_Rotate_180: pscr->rotate = 180; break;
case RR_Rotate_270: pscr->rotate = 270; break;
}
/*
* Can't rotate some formats
*/
switch (screen->fb[0].bitsPerPixel) {
case 8:
case 16:
case 32:
break;
default:
if (pscr->rotate)
goto bail2;
break;
}
pScreen->width = screen->width = vesaWidth(screen, mode);
pScreen->height = screen->height = vesaHeight(screen, mode);
if (rotation & (RR_Rotate_90|RR_Rotate_270))
{ {
pscr->mode = *mode; pScreen->mmWidth = pSize->mmHeight;
switch (screen->fb[0].bitsPerPixel) { pScreen->mmHeight = pSize->mmWidth;
case 8: }
case 16: else
case 32: {
switch (rotation) pScreen->mmWidth = pSize->mmWidth;
{ pScreen->mmHeight = pSize->mmHeight;
case RR_Rotate_0: }
pscr->rotate = 0;
break; vesaUnmapFramebuffer (screen);
case RR_Rotate_90: if (!vesaMapFramebuffer (screen))
pscr->rotate = 90; goto bail3;
break;
case RR_Rotate_180:
pscr->rotate = 180;
break;
case RR_Rotate_270:
pscr->rotate = 270;
break;
}
break;
default:
pscr->rotate = 0;
break;
}
screen->width = vesaWidth(screen, mode);
screen->height = vesaHeight(screen, mode);
pScreen->width = screen->width;
pScreen->height = screen->height;
if (rotation == 90 || rotation == 270)
{
pScreen->mmWidth = pSize->mmHeight;
pScreen->mmHeight = pSize->mmWidth;
}
else
{
pScreen->mmWidth = pSize->mmWidth;
pScreen->mmHeight = pSize->mmHeight;
}
#if 0 #if 0
/* /*
* XXX can't switch depths yet * XXX can't switch depths yet
*/ */
screen->fb[0].depth = depth; screen->fb[0].depth = depth;
screen->fb[0].bitsPerPixel = bpp; screen->fb[0].bitsPerPixel = bpp;
#endif #endif
screen->fb[0].byteStride = pscr->mode.BytesPerScanLine; screen->fb[0].byteStride = mode->BytesPerScanLine;
screen->fb[0].pixelStride = ((pscr->mode.BytesPerScanLine * 8) / screen->fb[0].bitsPerPixel); screen->fb[0].pixelStride = ((mode->BytesPerScanLine * 8) / screen->fb[0].bitsPerPixel);
if (!pscr->shadow)
{
(*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen), (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen),
screen->width, pScreen->width,
screen->height, pScreen->height,
screen->fb[0].depth, screen->fb[0].depth,
screen->fb[0].bitsPerPixel, screen->fb[0].bitsPerPixel,
screen->fb[0].byteStride, screen->fb[0].byteStride,
screen->fb[0].frameBuffer); screen->fb[0].frameBuffer);
} }
else
(void) vesaSetMode (pScreen, &pscr->mode); pNewLayer = vesaLayerCreate (pScreen);
if (!pNewLayer)
goto bail4;
if (WalkTree (pScreen, vesaLayerAdd, (pointer) pNewLayer) == WT_STOPWALKING)
goto bail5;
WalkTree (pScreen, vesaLayerRemove, (pointer) pscr->pLayer);
LayerDestroy (pScreen, pscr->pLayer);
pscr->pLayer = pNewLayer;
if (wasEnabled) if (wasEnabled)
KdEnableScreen (pScreen); KdEnableScreen (pScreen);
return ret;
return TRUE;
bail5:
WalkTree (pScreen, vesaLayerRemove, (pointer) pNewLayer);
LayerDestroy (pScreen, pNewLayer);
bail4:
vesaUnmapFramebuffer (screen);
*pscr = oldscr;
(void) vesaMapFramebuffer (screen);
bail3:
pScreen->width = screen->width = oldwidth;
pScreen->height = screen->height = oldheight;
pScreen->mmWidth = oldmmwidth;
pScreen->mmHeight = oldmmheight;
bail2:
*pscr = oldscr;
(void) vesaSetMode (pScreen, &pscr->mode);
bail1:
if (wasEnabled)
KdEnableScreen (pScreen);
bail0:
return FALSE;
} }
void Bool
vesaRandRInit (ScreenPtr pScreen) vesaRandRInit (ScreenPtr pScreen)
{ {
rrScrPriv(pScreen); rrScrPrivPtr pScrPriv;
if (!RRScreenInit (pScreen))
return FALSE;
if (!pScrPriv) pScrPriv = rrGetScrPriv(pScreen);
return;
pScrPriv->rrGetInfo = vesaRandRGetInfo; pScrPriv->rrGetInfo = vesaRandRGetInfo;
pScrPriv->rrSetConfig = vesaRandRSetConfig; pScrPriv->rrSetConfig = vesaRandRSetConfig;
return TRUE;
} }
#endif #endif
@ -1079,76 +1293,31 @@ vesaInitScreen(ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver; VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
ShadowUpdateProc update;
ShadowWindowProc window;
if (!LayerStartInit (pScreen))
return FALSE;
return TRUE;
}
if (pscr->shadow) Bool
{ vesaFinishInitScreen (ScreenPtr pScreen)
switch (pscr->mapping) { {
case VESA_LINEAR: KdScreenPriv(pScreen);
update = shadowUpdatePacked; VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
window = vesaWindowLinear;
break; pscr->layerKind = LayerNewKind (pScreen);
case VESA_WINDOWED:
update = shadowUpdatePacked; if (!LayerFinishInit (pScreen))
window = vesaWindowWindowed; return FALSE;
break;
case VESA_PLANAR: pscr->pLayer = vesaLayerCreate (pScreen);
pScreen->CreateColormap = vesaCreateColormap16; if (!pscr->pLayer)
if (pScreenPriv->screen->fb[0].bitsPerPixel == 8) return FALSE;
update = shadowUpdatePlanar4x8;
else
update = shadowUpdatePlanar4;
window = vesaWindowPlanar;
pscr->rotate = 0;
break;
case VESA_MONO:
update = vesaUpdateMono;
if (pscr->mode.mode < 8)
window = vesaWindowCga;
else
window = vesaWindowLinear;
pscr->rotate = 0;
break;
}
switch (pscr->rotate) {
case 90:
switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
case 8:
update = shadowUpdateRotate8_90; break;
case 16:
update = shadowUpdateRotate16_90; break;
case 32:
update = shadowUpdateRotate32_90; break;
}
break;
case 180:
switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
case 8:
update = shadowUpdateRotate8_180; break;
case 16:
update = shadowUpdateRotate16_180; break;
case 32:
update = shadowUpdateRotate32_180; break;
}
break;
case 270:
switch (pScreenPriv->screen->fb[0].bitsPerPixel) {
case 8:
update = shadowUpdateRotate8_270; break;
case 16:
update = shadowUpdateRotate16_270; break;
case 32:
update = shadowUpdateRotate32_270; break;
}
break;
}
return KdShadowInitScreen (pScreen, update, window);
}
#ifdef RANDR #ifdef RANDR
vesaRandRInit (pScreen); if (!vesaRandRInit (pScreen))
return FALSE;
#endif #endif
return TRUE; return TRUE;
@ -1352,16 +1521,7 @@ vesaScreenFini(KdScreenInfo *screen)
VesaScreenPrivPtr pscr = screen->driver; VesaScreenPrivPtr pscr = screen->driver;
VesaCardPrivPtr priv = screen->card->driver; VesaCardPrivPtr priv = screen->card->driver;
if (pscr->fb) vesaUnmapFramebuffer (screen);
{
if (pscr->mode.vbe)
VbeUnmapFramebuffer(priv->vi, priv->vbeInfo, pscr->mode.mode, pscr->fb);
else
VgaUnmapFramebuffer (priv->vi);
}
if (pscr->shadow)
KdShadowScreenFini (screen);
screen->fb[0].depth = pscr->origDepth; screen->fb[0].depth = pscr->origDepth;
} }

View File

@ -19,13 +19,17 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.h,v 1.8 2001/05/26 01:25:42 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.h,v 1.9 2001/05/29 04:54:13 keithp Exp $ */
#ifndef _VESA_H_ #ifndef _VESA_H_
#define _VESA_H_ #define _VESA_H_
#include "kdrive.h" #include "kdrive.h"
#include "layer.h"
#include "vm86.h" #include "vm86.h"
#ifdef RANDR
#include "randrstr.h"
#endif
#define VESA_TEXT_SAVE (64*1024) #define VESA_TEXT_SAVE (64*1024)
@ -93,8 +97,10 @@ typedef struct _VesaScreenPriv {
int rotate; int rotate;
int mapping; int mapping;
int origDepth; int origDepth;
int layerKind;
void *fb; void *fb;
int fb_size; int fb_size;
LayerPtr pLayer;
} VesaScreenPrivRec, *VesaScreenPrivPtr; } VesaScreenPrivRec, *VesaScreenPrivPtr;
extern int vesa_video_mode; extern int vesa_video_mode;
@ -118,9 +124,15 @@ vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr);
Bool Bool
vesaScreenInit(KdScreenInfo *screen); vesaScreenInit(KdScreenInfo *screen);
LayerPtr
vesaLayerCreate (ScreenPtr pScreen);
Bool Bool
vesaInitScreen(ScreenPtr pScreen); vesaInitScreen(ScreenPtr pScreen);
Bool
vesaFinishInitScreen(ScreenPtr pScreen);
Bool Bool
vesaEnable(ScreenPtr pScreen); vesaEnable(ScreenPtr pScreen);

View File

@ -19,7 +19,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesainit.c,v 1.4 2000/10/20 00:19:50 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesainit.c,v 1.5 2000/12/08 21:40:29 keithp Exp $ */
#include "vesa.h" #include "vesa.h"
@ -49,6 +49,8 @@ const KdCardFuncs vesaFuncs = {
vesaGetColors, /* getColors */ vesaGetColors, /* getColors */
vesaPutColors, /* putColors */ vesaPutColors, /* putColors */
vesaFinishInitScreen, /* finishInitScreen */
}; };
void void