From 46422951543b7820665bf93bb0cf7ff307b2e358 Mon Sep 17 00:00:00 2001 From: Rudolf Cornelissen Date: Mon, 31 May 2004 11:33:14 +0000 Subject: [PATCH] added pixelprecise panning for all colordepths git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7692 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/accelerants/neomagic/Cursor.c | 20 +++---------- .../accelerants/neomagic/SetDisplayMode.c | 11 +++---- .../accelerants/neomagic/engine/nm_crtc.c | 30 ++++++++++++++----- .../accelerants/neomagic/engine/nm_general.c | 2 +- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/add-ons/accelerants/neomagic/Cursor.c b/src/add-ons/accelerants/neomagic/Cursor.c index 40343cb741..26aa79c2ff 100644 --- a/src/add-ons/accelerants/neomagic/Cursor.c +++ b/src/add-ons/accelerants/neomagic/Cursor.c @@ -3,7 +3,7 @@ This file may be used under the terms of the Be Sample Code License. Other authors: - Rudolf Cornelissen 4/2003-6/2003 + Rudolf Cornelissen 4/2003-5/2004 */ #define MODULE_BIT 0x20000000 @@ -54,21 +54,9 @@ void MOVE_CURSOR(uint16 x, uint16 y) si->cursor.x = x; si->cursor.y = y; - switch(si->dm.space) - { - case B_CMAP8: - h_adjust = 0x03; - break; - case B_RGB15_LITTLE:case B_RGB16_LITTLE: - h_adjust = 0x01; - break; - case B_RGB32_LITTLE: - h_adjust = 0x00; - break; - default: - h_adjust = 0x03; - break; - } + /* setting up minimum amount to scroll not needed: + * Neomagic cards can always do pixelprecise panning */ + h_adjust = 0x00; /* if internal panel is active correct visible screensize! */ if (nm_general_output_read() & 0x02) diff --git a/src/add-ons/accelerants/neomagic/SetDisplayMode.c b/src/add-ons/accelerants/neomagic/SetDisplayMode.c index 8887add929..416a1c4c9b 100644 --- a/src/add-ons/accelerants/neomagic/SetDisplayMode.c +++ b/src/add-ons/accelerants/neomagic/SetDisplayMode.c @@ -170,20 +170,21 @@ status_t MOVE_DISPLAY(uint16 h_display_start, uint16 v_display_start) LOG(4,("MOVE_DISPLAY: h %d, v %d\n", h_display_start, v_display_start)); - /* reset lower bits, don't return an error! */ + /* Neomagic cards support pixelprecise panning in all modes: + * No stepping granularity needed! */ + + /* determine bits used for the colordepth */ switch(si->dm.space) { case B_CMAP8: colour_depth=8; - h_display_start &= ~0x03; break; - case B_RGB15_LITTLE: case B_RGB16_LITTLE: + case B_RGB15_LITTLE: + case B_RGB16_LITTLE: colour_depth=16; - h_display_start &= ~0x01; break; case B_RGB24_LITTLE: colour_depth=24; - h_display_start &= ~0x03; break; default: return B_ERROR; diff --git a/src/add-ons/accelerants/neomagic/engine/nm_crtc.c b/src/add-ons/accelerants/neomagic/engine/nm_crtc.c index e40dfd2d79..da2e9df318 100644 --- a/src/add-ons/accelerants/neomagic/engine/nm_crtc.c +++ b/src/add-ons/accelerants/neomagic/engine/nm_crtc.c @@ -481,12 +481,10 @@ status_t nm_crtc_set_display_start(uint32 startadd,uint8 bpp) timeout++; } - /* the neomagic framebuffer startadress is given in 32bit words */ - startadd >>= 2; - /* set standard VGA registers */ - ISACRTCW(FBSTADDH, ((startadd & 0x00FF00) >> 8)); - ISACRTCW(FBSTADDL, (startadd & 0x0000FF)); + /* (startadress in 32bit words (b2 - b17) */ + ISACRTCW(FBSTADDH, ((startadd & 0x03fc00) >> 10)); + ISACRTCW(FBSTADDL, ((startadd & 0x0003fc) >> 2)); /* set NM extended register */ //fixme: NM2380 _must_ have one more bit (has >4Mb RAM)!! @@ -496,9 +494,27 @@ status_t nm_crtc_set_display_start(uint32 startadd,uint8 bpp) /* we need to wait a bit or the card will mess-up it's register values.. (NM2160) */ snooze(10); if (si->ps.card_type < NM2200) - ISAGRPHW(FBSTADDE,(((startadd >> 16) & 0x07) | (val & 0xf8))); + /* extended bits: (b18-20) */ + ISAGRPHW(FBSTADDE,(((startadd >> 18) & 0x07) | (val & 0xf8))); else - ISAGRPHW(FBSTADDE,(((startadd >> 16) & 0x0f) | (val & 0xf0))); + /* extended bits: (b18-21) */ + ISAGRPHW(FBSTADDE,(((startadd >> 18) & 0x0f) | (val & 0xf0))); + + /* set byte adress: (b0 - 1): + * Neomagic cards work with _pixel_ offset here. */ + switch(bpp) + { + case 8: + ISAATBW(HORPIXPAN, (startadd & 0x00000003)); + break; + case 15: + case 16: + ISAATBW(HORPIXPAN, ((startadd & 0x00000002) >> 1)); + break; + case 24: + ISAATBW(HORPIXPAN, ((4 - (startadd & 0x00000003)) & 0x03)); + break; + } return B_OK; } diff --git a/src/add-ons/accelerants/neomagic/engine/nm_general.c b/src/add-ons/accelerants/neomagic/engine/nm_general.c index 8b681de4b7..2f9e02e382 100644 --- a/src/add-ons/accelerants/neomagic/engine/nm_general.c +++ b/src/add-ons/accelerants/neomagic/engine/nm_general.c @@ -47,7 +47,7 @@ status_t nm_general_powerup() { status_t status; - LOG(1,("POWERUP: Neomagic (open)BeOS Accelerant 0.06-14 running.\n")); + LOG(1,("POWERUP: Neomagic (open)BeOS Accelerant 0.06-15 running.\n")); /* detect card type and power it up */ switch(CFGR(DEVID))