diff options
author | Keith Packard <keithp@keithp.com> | 2004-06-28 00:48:51 +0000 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2004-06-28 00:48:51 +0000 |
commit | 7ff67f2872ddd15908f789ec9bdb76e8211d6431 (patch) | |
tree | 04caafc996ec21117517e3db247e3b1f1944322b /hw/kdrive | |
parent | 5b75aae2cf1ad38556e9a55da72ad65419aa7f84 (diff) |
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.
Diffstat (limited to 'hw/kdrive')
-rw-r--r-- | hw/kdrive/ati/ati.c | 150 | ||||
-rw-r--r-- | hw/kdrive/ati/ati.h | 5 | ||||
-rw-r--r-- | hw/kdrive/ati/ati_cursor.c | 2 | ||||
-rw-r--r-- | hw/kdrive/ati/ati_draw.c | 30 | ||||
-rw-r--r-- | hw/kdrive/fbdev/fbdev.c | 5 |
5 files changed, 129 insertions, 63 deletions
diff --git a/hw/kdrive/ati/ati.c b/hw/kdrive/ati/ati.c index 1aa2e520b..d2de536cf 100644 --- a/hw/kdrive/ati/ati.c +++ b/hw/kdrive/ati/ati.c @@ -203,6 +203,9 @@ ATICardInit(KdCardInfo *card) atic->backend_funcs.disable = fbdevDisable; atic->backend_funcs.getColors = fbdevGetColors; atic->backend_funcs.putColors = fbdevPutColors; +#ifdef RANDR + atic->backend_funcs.randrSetConfig = fbdevRandRSetConfig; +#endif } #endif #ifdef KDRIVEVESA @@ -221,6 +224,9 @@ ATICardInit(KdCardInfo *card) atic->backend_funcs.disable = vesaDisable; atic->backend_funcs.getColors = vesaGetColors; atic->backend_funcs.putColors = vesaPutColors; +#ifdef RANDR + atic->backend_funcs.randrSetConfig = vesaRandRSetConfig; +#endif } #endif @@ -277,62 +283,31 @@ ATICardFini(KdCardInfo *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); - Bool success = FALSE; - int screen_size = 0; - int cursor_size; + ATIScreenInfo *atis = (ATIScreenInfo *)screen->driver; + int screen_size = screen->fb[0].byteStride * screen->height; #if defined(USE_DRI) && defined(GLXEXT) int l; #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; 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 - cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_PITCH * 2; - /* Reserve the area for the cursor. */ - if (screen->off_screen_base + cursor_size <= screen->memory_size) { - atis->cursor.offset = screen->off_screen_base; - screen->off_screen_base += cursor_size; - } + atis->cursor.cursor_size = ATI_CURSOR_HEIGHT * ATI_CURSOR_PITCH * 3; + + atis->cursor.offset = screen->off_screen_base; + + screen->off_screen_base += atis->cursor.cursor_size; #if defined(USE_DRI) && defined(GLXEXT) /* 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; screen->off_screen_base += atis->scratch_size; atis->scratch_next = atis->scratch_offset; - } else { + } + else + { 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; } +#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 ATIScreenFini(KdScreenInfo *screen) { @@ -459,7 +505,13 @@ ATIFinishInitScreen(ScreenPtr pScreen) KdScreenPriv(pScreen); 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 @@ -507,6 +559,8 @@ ATIEnable(ScreenPtr pScreen) if (!atic->backend_funcs.enable(pScreen)) return FALSE; + ATISetOffscreen (pScreenPriv->screen); + if ((atic->reg_base == NULL) && !ATIMapReg(pScreenPriv->screen->card, atic)) return FALSE; diff --git a/hw/kdrive/ati/ati.h b/hw/kdrive/ati/ati.h index a8ca47fd6..07f2a056d 100644 --- a/hw/kdrive/ati/ati.h +++ b/hw/kdrive/ati/ati.h @@ -122,6 +122,9 @@ struct backend_funcs { void (*disable)(ScreenPtr); void (*getColors)(ScreenPtr, int, int, xColorItem *); void (*putColors)(ScreenPtr, int, int, xColorItem *); +#ifdef RANDR + Bool (*randrSetConfig) (ScreenPtr, Rotation, int, RRScreenSizePtr); +#endif }; typedef struct _ATICardInfo { @@ -161,6 +164,8 @@ typedef struct _ATICursor { Pixel source, mask; KdOffscreenArea *area; CARD32 offset; + + int cursor_size; } ATICursor; typedef struct _ATIPortPriv { diff --git a/hw/kdrive/ati/ati_cursor.c b/hw/kdrive/ati/ati_cursor.c index f59b4639f..1be5130fe 100644 --- a/hw/kdrive/ati/ati_cursor.c +++ b/hw/kdrive/ati/ati_cursor.c @@ -495,7 +495,7 @@ ATICursorInit(ScreenPtr pScreen) pCurPriv->has_cursor = FALSE; - if (pCurPriv->offset == 0) + if (pCurPriv->cursor_size == 0) return FALSE; if (atic->reg_base == NULL) diff --git a/hw/kdrive/ati/ati_draw.c b/hw/kdrive/ati/ati_draw.c index 1f378b9e3..5b6681a04 100644 --- a/hw/kdrive/ati/ati_draw.c +++ b/hw/kdrive/ati/ati_draw.c @@ -175,7 +175,9 @@ RadeonSwitchTo2D(ATIScreenInfo *atis) { 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, RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); END_DMA(); @@ -186,7 +188,9 @@ RadeonSwitchTo3D(ATIScreenInfo *atis) { 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, RADEON_WAIT_HOST_IDLECLEAN | RADEON_WAIT_2D_IDLECLEAN); END_DMA(); @@ -658,10 +662,9 @@ ATIUploadToScratch(PixmapPtr pSrc, PixmapPtr pDst) } static void -ATIBlockHandler (int screen, pointer blockData, pointer timeout, - pointer readmask) +ATIBlockHandler (pointer blockData, OSTimePtr timeout, pointer readmask) { - ScreenPtr pScreen = screenInfo.screens[screen]; + ScreenPtr pScreen = (ScreenPtr) blockData; KdScreenPriv(pScreen); ATIScreenInfo(pScreenPriv); @@ -671,6 +674,11 @@ ATIBlockHandler (int screen, pointer blockData, pointer timeout, ATIFlushIndirect(atis, 1); } +static void +ATIWakeupHandler (pointer blockData, int result, pointer readmask) +{ +} + Bool ATIDrawInit(ScreenPtr pScreen) { @@ -774,8 +782,8 @@ ATIDrawEnable(ScreenPtr pScreen) atis->kaa.UploadToScreen = ATIUploadToScreen; atis->kaa.UploadToScratch = ATIUploadToScratch; - atis->save_blockhandler = pScreen->BlockHandler; - pScreen->BlockHandler = ATIBlockHandler; + RegisterBlockAndWakeupHandlers (ATIBlockHandler, ATIWakeupHandler, + pScreen); KdMarkSync(pScreen); } @@ -783,19 +791,17 @@ ATIDrawEnable(ScreenPtr pScreen) void ATIDrawDisable(ScreenPtr pScreen) { - KdScreenPriv(pScreen); - ATIScreenInfo(pScreenPriv); - ATIDMATeardown(pScreen); - pScreen->BlockHandler = atis->save_blockhandler; + RemoveBlockAndWakeupHandlers (ATIBlockHandler, ATIWakeupHandler, + pScreen); } void ATIDrawFini(ScreenPtr pScreen) { - KdScreenPriv(pScreen); #ifdef USE_DRI + KdScreenPriv(pScreen); ATIScreenInfo(pScreenPriv); if (atis->using_dri) { ATIDRICloseScreen(pScreen); diff --git a/hw/kdrive/fbdev/fbdev.c b/hw/kdrive/fbdev/fbdev.c index d904a4aa1..44a95d19e 100644 --- a/hw/kdrive/fbdev/fbdev.c +++ b/hw/kdrive/fbdev/fbdev.c @@ -333,14 +333,14 @@ fbdevMapFramebuffer (KdScreenInfo *screen) screen->width = priv->var.xres; screen->height = priv->var.yres; screen->memory_base = (CARD8 *) (priv->fb); - screen->memory_size = 0; - screen->off_screen_base = 0; + screen->memory_size = priv->fix.smem_len; if (scrpriv->shadow) { if (!KdShadowFbAlloc (screen, 0, scrpriv->randr & (RR_Rotate_90|RR_Rotate_270))) return FALSE; + screen->off_screen_base = screen->memory_size; } else { @@ -348,6 +348,7 @@ fbdevMapFramebuffer (KdScreenInfo *screen) screen->fb[0].pixelStride = (priv->fix.line_length * 8 / priv->var.bits_per_pixel); screen->fb[0].frameBuffer = (CARD8 *) (priv->fb); + screen->off_screen_base = screen->fb[0].byteStride * screen->height; } return TRUE; |