diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2008-07-11 19:32:06 -0400 |
---|---|---|
committer | Alex Deucher <alexdeucher@gmail.com> | 2008-08-25 10:06:07 -0400 |
commit | 6cebfe257f7ddad855ee743e4eb899bd6fac7f46 (patch) | |
tree | 876e6d2560a1a116d74944379ad3cb810bc952db /src | |
parent | 4dff54a3c8d7c9f2d6ec50354ff0b92f1b7fcbdf (diff) |
Switch EXA path back to static cursor allocation
pre-AVIVO cards have address limits for the cursor offset
Diffstat (limited to 'src')
-rw-r--r-- | src/radeon_cursor.c | 32 | ||||
-rw-r--r-- | src/radeon_exa.c | 22 |
2 files changed, 39 insertions, 15 deletions
diff --git a/src/radeon_cursor.c b/src/radeon_cursor.c index 11fd4984..22a33d61 100644 --- a/src/radeon_cursor.c +++ b/src/radeon_cursor.c @@ -335,21 +335,23 @@ Bool RADEONCursorInit(ScreenPtr pScreen) height = ((size_bytes * xf86_config->num_crtc) + width_bytes - 1) / width_bytes; int align = IS_AVIVO_VARIANT ? 4096 : 256; - for (c = 0; c < xf86_config->num_crtc; c++) { - xf86CrtcPtr crtc = xf86_config->crtc[c]; - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - - radeon_crtc->cursor_offset = - radeon_allocate_memory(pScrn, &radeon_crtc->cursor_mem, size_bytes, align); - - if (radeon_crtc->cursor_offset == 0) - return FALSE; - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Will use %d kb for hardware cursor %d at offset 0x%08x\n", - (size_bytes * xf86_config->num_crtc) / 1024, - c, - (unsigned int)radeon_crtc->cursor_offset); + if (!info->useEXA) { + for (c = 0; c < xf86_config->num_crtc; c++) { + xf86CrtcPtr crtc = xf86_config->crtc[c]; + RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; + + radeon_crtc->cursor_offset = + radeon_allocate_memory(pScrn, &radeon_crtc->cursor_mem, size_bytes, align); + + if (radeon_crtc->cursor_offset == 0) + return FALSE; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Will use %d kb for hardware cursor %d at offset 0x%08x\n", + (size_bytes * xf86_config->num_crtc) / 1024, + c, + (unsigned int)radeon_crtc->cursor_offset); + } } return xf86_cursors_init (pScreen, CURSOR_WIDTH, CURSOR_HEIGHT, diff --git a/src/radeon_exa.c b/src/radeon_exa.c index a1b93b52..39453000 100644 --- a/src/radeon_exa.c +++ b/src/radeon_exa.c @@ -386,6 +386,7 @@ Bool RADEONSetupMemEXA (ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; RADEONInfoPtr info = RADEONPTR(pScrn); + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); int cpp = info->CurrentLayout.pixel_bytes; int screen_size; int byteStride = pScrn->displayWidth * cpp; @@ -413,6 +414,27 @@ Bool RADEONSetupMemEXA (ScreenPtr pScreen) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Allocating from a screen of %ld kb\n", info->accel_state->exa->memorySize / 1024); + /* Reserve static area for hardware cursor */ + if (!xf86ReturnOptValBool(info->Options, OPTION_SW_CURSOR, FALSE)) { + int cursor_size = 64 * 4 * 64; + int align = IS_AVIVO_VARIANT ? 4096 : 256; + int c; + + for (c = 0; c < xf86_config->num_crtc; c++) { + xf86CrtcPtr crtc = xf86_config->crtc[c]; + RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; + + radeon_crtc->cursor_offset = + RADEON_ALIGN(info->accel_state->exa->offScreenBase, align); + info->accel_state->exa->offScreenBase = radeon_crtc->cursor_offset + cursor_size; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Will use %d kb for hardware cursor %d at offset 0x%08x\n", + (cursor_size * xf86_config->num_crtc) / 1024, + c, + (unsigned int)radeon_crtc->cursor_offset); + } + } #if defined(XF86DRI) if (info->directRenderingEnabled) { |