Separate out off-screen allocation from Init. Fix Enable to update

off-screen addresses. Wrap RandR to update off-screen addresses.
Set off_screen_base and memory_size fields correctly.
This commit is contained in:
Keith Packard 2004-06-28 00:48:51 +00:00
parent 5b75aae2cf
commit 7ff67f2872
5 changed files with 129 additions and 63 deletions

View File

@ -203,6 +203,9 @@ ATICardInit(KdCardInfo *card)
atic->backend_funcs.disable = fbdevDisable; atic->backend_funcs.disable = fbdevDisable;
atic->backend_funcs.getColors = fbdevGetColors; atic->backend_funcs.getColors = fbdevGetColors;
atic->backend_funcs.putColors = fbdevPutColors; atic->backend_funcs.putColors = fbdevPutColors;
#ifdef RANDR
atic->backend_funcs.randrSetConfig = fbdevRandRSetConfig;
#endif
} }
#endif #endif
#ifdef KDRIVEVESA #ifdef KDRIVEVESA
@ -221,6 +224,9 @@ ATICardInit(KdCardInfo *card)
atic->backend_funcs.disable = vesaDisable; atic->backend_funcs.disable = vesaDisable;
atic->backend_funcs.getColors = vesaGetColors; atic->backend_funcs.getColors = vesaGetColors;
atic->backend_funcs.putColors = vesaPutColors; atic->backend_funcs.putColors = vesaPutColors;
#ifdef RANDR
atic->backend_funcs.randrSetConfig = vesaRandRSetConfig;
#endif
} }
#endif #endif
@ -277,62 +283,31 @@ ATICardFini(KdCardInfo *card)
atic->backend_funcs.cardfini(card); atic->backend_funcs.cardfini(card);
} }
static Bool /*
ATIScreenInit(KdScreenInfo *screen) * Once screen->off_screen_base is set, this function
* allocates the remaining memory appropriately
*/
static void
ATISetOffscreen (KdScreenInfo *screen)
{ {
ATIScreenInfo *atis;
ATICardInfo(screen); ATICardInfo(screen);
Bool success = FALSE; ATIScreenInfo *atis = (ATIScreenInfo *)screen->driver;
int screen_size = 0; int screen_size = screen->fb[0].byteStride * screen->height;
int cursor_size;
#if defined(USE_DRI) && defined(GLXEXT) #if defined(USE_DRI) && defined(GLXEXT)
int l; int l;
#endif #endif
atis = xcalloc(sizeof(ATIScreenInfo), 1);
if (atis == NULL)
return FALSE;
atis->atic = atic;
atis->screen = screen;
screen->driver = atis;
#ifdef KDRIVEFBDEV
if (atic->use_fbdev) {
success = fbdevScreenInitialize(screen,
&atis->backend_priv.fbdev);
screen->memory_size = atic->backend_priv.fbdev.fix.smem_len;
screen_size = atic->backend_priv.fbdev.var.yres_virtual *
screen->fb[0].byteStride;
}
#endif
#ifdef KDRIVEVESA
if (atic->use_vesa) {
if (screen->fb[0].depth == 0)
screen->fb[0].depth = 16;
success = vesaScreenInitialize(screen,
&atis->backend_priv.vesa);
screen_size = screen->off_screen_base;
}
#endif
if (!success) {
screen->driver = NULL;
xfree(atis);
return FALSE;
}
screen->off_screen_base = screen_size; screen->off_screen_base = screen_size;
if (atic->is_radeon) if (atic->is_radeon)
cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_WIDTH * 4; atis->cursor.cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_WIDTH * 4;
else else
cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_PITCH * 2; atis->cursor.cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_PITCH * 3;
/* Reserve the area for the cursor. */
if (screen->off_screen_base + cursor_size <= screen->memory_size) {
atis->cursor.offset = screen->off_screen_base; atis->cursor.offset = screen->off_screen_base;
screen->off_screen_base += cursor_size;
} screen->off_screen_base += atis->cursor.cursor_size;
#if defined(USE_DRI) && defined(GLXEXT) #if defined(USE_DRI) && defined(GLXEXT)
/* Reserve a static area for the back buffer the same size as the /* Reserve a static area for the back buffer the same size as the
@ -393,13 +368,84 @@ ATIScreenInit(KdScreenInfo *screen)
atis->scratch_offset = screen->off_screen_base; atis->scratch_offset = screen->off_screen_base;
screen->off_screen_base += atis->scratch_size; screen->off_screen_base += atis->scratch_size;
atis->scratch_next = atis->scratch_offset; atis->scratch_next = atis->scratch_offset;
} else { }
else
{
atis->scratch_size = 0; atis->scratch_size = 0;
} }
}
static Bool
ATIScreenInit(KdScreenInfo *screen)
{
ATIScreenInfo *atis;
ATICardInfo(screen);
Bool success = FALSE;
atis = xcalloc(sizeof(ATIScreenInfo), 1);
if (atis == NULL)
return FALSE;
atis->atic = atic;
atis->screen = screen;
screen->driver = atis;
if (screen->fb[0].depth == 0)
screen->fb[0].depth = 16;
#ifdef KDRIVEFBDEV
if (atic->use_fbdev) {
success = fbdevScreenInitialize(screen,
&atis->backend_priv.fbdev);
}
#endif
#ifdef KDRIVEVESA
if (atic->use_vesa) {
success = vesaScreenInitialize(screen,
&atis->backend_priv.vesa);
}
#endif
if (!success) {
screen->driver = NULL;
xfree(atis);
return FALSE;
}
ATISetOffscreen (screen);
return TRUE; return TRUE;
} }
#ifdef RANDR
static Bool
ATIRandRSetConfig (ScreenPtr pScreen,
Rotation randr,
int rate,
RRScreenSizePtr pSize)
{
KdScreenPriv(pScreen);
KdScreenInfo *screen = pScreenPriv->screen;
ATICardInfo *atic = screen->card->driver;
Bool ret;
ATIDrawDisable (pScreen);
ret = atic->backend_funcs.randrSetConfig(pScreen, randr, rate, pSize);
ATISetOffscreen (screen);
ATIDrawEnable (pScreen);
return ret;
}
static Bool
ATIRandRInit (ScreenPtr pScreen)
{
rrScrPrivPtr pScrPriv;
pScrPriv = rrGetScrPriv(pScreen);
pScrPriv->rrSetConfig = ATIRandRSetConfig;
return TRUE;
}
#endif
static void static void
ATIScreenFini(KdScreenInfo *screen) ATIScreenFini(KdScreenInfo *screen)
{ {
@ -459,7 +505,13 @@ ATIFinishInitScreen(ScreenPtr pScreen)
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
ATICardInfo(pScreenPriv); ATICardInfo(pScreenPriv);
return atic->backend_funcs.finishInitScreen(pScreen); if (!atic->backend_funcs.finishInitScreen(pScreen))
return FALSE;
#ifdef RANDR
if (!ATIRandRInit (pScreen))
return FALSE;
#endif
return TRUE;
} }
static Bool static Bool
@ -507,6 +559,8 @@ ATIEnable(ScreenPtr pScreen)
if (!atic->backend_funcs.enable(pScreen)) if (!atic->backend_funcs.enable(pScreen))
return FALSE; return FALSE;
ATISetOffscreen (pScreenPriv->screen);
if ((atic->reg_base == NULL) && !ATIMapReg(pScreenPriv->screen->card, if ((atic->reg_base == NULL) && !ATIMapReg(pScreenPriv->screen->card,
atic)) atic))
return FALSE; return FALSE;

View File

@ -122,6 +122,9 @@ struct backend_funcs {
void (*disable)(ScreenPtr); void (*disable)(ScreenPtr);
void (*getColors)(ScreenPtr, int, int, xColorItem *); void (*getColors)(ScreenPtr, int, int, xColorItem *);
void (*putColors)(ScreenPtr, int, int, xColorItem *); void (*putColors)(ScreenPtr, int, int, xColorItem *);
#ifdef RANDR
Bool (*randrSetConfig) (ScreenPtr, Rotation, int, RRScreenSizePtr);
#endif
}; };
typedef struct _ATICardInfo { typedef struct _ATICardInfo {
@ -161,6 +164,8 @@ typedef struct _ATICursor {
Pixel source, mask; Pixel source, mask;
KdOffscreenArea *area; KdOffscreenArea *area;
CARD32 offset; CARD32 offset;
int cursor_size;
} ATICursor; } ATICursor;
typedef struct _ATIPortPriv { typedef struct _ATIPortPriv {

View File

@ -495,7 +495,7 @@ ATICursorInit(ScreenPtr pScreen)
pCurPriv->has_cursor = FALSE; pCurPriv->has_cursor = FALSE;
if (pCurPriv->offset == 0) if (pCurPriv->cursor_size == 0)
return FALSE; return FALSE;
if (atic->reg_base == NULL) if (atic->reg_base == NULL)

View File

@ -175,7 +175,9 @@ RadeonSwitchTo2D(ATIScreenInfo *atis)
{ {
RING_LOCALS; RING_LOCALS;
BEGIN_DMA(2); BEGIN_DMA(4);
OUT_REG(RADEON_REG_RB2D_DSTCACHE_CTLSTAT,
RADEON_RB2D_DC_FLUSH);
OUT_REG(ATI_REG_WAIT_UNTIL, OUT_REG(ATI_REG_WAIT_UNTIL,
RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN);
END_DMA(); END_DMA();
@ -186,7 +188,9 @@ RadeonSwitchTo3D(ATIScreenInfo *atis)
{ {
RING_LOCALS; RING_LOCALS;
BEGIN_DMA(2); BEGIN_DMA(4);
OUT_REG(RADEON_REG_RB2D_DSTCACHE_CTLSTAT,
RADEON_RB2D_DC_FLUSH);
OUT_REG(ATI_REG_WAIT_UNTIL, OUT_REG(ATI_REG_WAIT_UNTIL,
RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_2D_IDLECLEAN); RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_2D_IDLECLEAN);
END_DMA(); END_DMA();
@ -658,10 +662,9 @@ ATIUploadToScratch(PixmapPtr pSrc, PixmapPtr pDst)
} }
static void static void
ATIBlockHandler (int screen, pointer blockData, pointer timeout, ATIBlockHandler (pointer blockData, OSTimePtr timeout, pointer readmask)
pointer readmask)
{ {
ScreenPtr pScreen = screenInfo.screens[screen]; ScreenPtr pScreen = (ScreenPtr) blockData;
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
ATIScreenInfo(pScreenPriv); ATIScreenInfo(pScreenPriv);
@ -671,6 +674,11 @@ ATIBlockHandler (int screen, pointer blockData, pointer timeout,
ATIFlushIndirect(atis, 1); ATIFlushIndirect(atis, 1);
} }
static void
ATIWakeupHandler (pointer blockData, int result, pointer readmask)
{
}
Bool Bool
ATIDrawInit(ScreenPtr pScreen) ATIDrawInit(ScreenPtr pScreen)
{ {
@ -774,8 +782,8 @@ ATIDrawEnable(ScreenPtr pScreen)
atis->kaa.UploadToScreen = ATIUploadToScreen; atis->kaa.UploadToScreen = ATIUploadToScreen;
atis->kaa.UploadToScratch = ATIUploadToScratch; atis->kaa.UploadToScratch = ATIUploadToScratch;
atis->save_blockhandler = pScreen->BlockHandler; RegisterBlockAndWakeupHandlers (ATIBlockHandler, ATIWakeupHandler,
pScreen->BlockHandler = ATIBlockHandler; pScreen);
KdMarkSync(pScreen); KdMarkSync(pScreen);
} }
@ -783,19 +791,17 @@ ATIDrawEnable(ScreenPtr pScreen)
void void
ATIDrawDisable(ScreenPtr pScreen) ATIDrawDisable(ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen);
ATIScreenInfo(pScreenPriv);
ATIDMATeardown(pScreen); ATIDMATeardown(pScreen);
pScreen->BlockHandler = atis->save_blockhandler; RemoveBlockAndWakeupHandlers (ATIBlockHandler, ATIWakeupHandler,
pScreen);
} }
void void
ATIDrawFini(ScreenPtr pScreen) ATIDrawFini(ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen);
#ifdef USE_DRI #ifdef USE_DRI
KdScreenPriv(pScreen);
ATIScreenInfo(pScreenPriv); ATIScreenInfo(pScreenPriv);
if (atis->using_dri) { if (atis->using_dri) {
ATIDRICloseScreen(pScreen); ATIDRICloseScreen(pScreen);

View File

@ -333,14 +333,14 @@ fbdevMapFramebuffer (KdScreenInfo *screen)
screen->width = priv->var.xres; screen->width = priv->var.xres;
screen->height = priv->var.yres; screen->height = priv->var.yres;
screen->memory_base = (CARD8 *) (priv->fb); screen->memory_base = (CARD8 *) (priv->fb);
screen->memory_size = 0; screen->memory_size = priv->fix.smem_len;
screen->off_screen_base = 0;
if (scrpriv->shadow) if (scrpriv->shadow)
{ {
if (!KdShadowFbAlloc (screen, 0, if (!KdShadowFbAlloc (screen, 0,
scrpriv->randr & (RR_Rotate_90|RR_Rotate_270))) scrpriv->randr & (RR_Rotate_90|RR_Rotate_270)))
return FALSE; return FALSE;
screen->off_screen_base = screen->memory_size;
} }
else else
{ {
@ -348,6 +348,7 @@ fbdevMapFramebuffer (KdScreenInfo *screen)
screen->fb[0].pixelStride = (priv->fix.line_length * 8 / screen->fb[0].pixelStride = (priv->fix.line_length * 8 /
priv->var.bits_per_pixel); priv->var.bits_per_pixel);
screen->fb[0].frameBuffer = (CARD8 *) (priv->fb); screen->fb[0].frameBuffer = (CARD8 *) (priv->fb);
screen->off_screen_base = screen->fb[0].byteStride * screen->height;
} }
return TRUE; return TRUE;