From a38565b80b8f9e9b0417abbc466c5116ca99f3e4 Mon Sep 17 00:00:00 2001 From: Rudolf Cornelissen Date: Sat, 29 May 2004 12:19:22 +0000 Subject: [PATCH] centering update for external monitor only mode git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7670 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../accelerants/neomagic/SetDisplayMode.c | 4 +- .../accelerants/neomagic/engine/nm_crtc.c | 93 ++++++++++--------- .../accelerants/neomagic/engine/nm_general.c | 2 +- .../accelerants/neomagic/engine/nm_proto.h | 2 +- 4 files changed, 52 insertions(+), 49 deletions(-) diff --git a/src/add-ons/accelerants/neomagic/SetDisplayMode.c b/src/add-ons/accelerants/neomagic/SetDisplayMode.c index 1e3625372a..046d73e2bf 100644 --- a/src/add-ons/accelerants/neomagic/SetDisplayMode.c +++ b/src/add-ons/accelerants/neomagic/SetDisplayMode.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-4/2004 + Rudolf Cornelissen 4/2003-5/2004 */ #define MODULE_BIT 0x00200000 @@ -127,7 +127,7 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set) nm_crtc_set_timing(target, crt_only); /* always setup centering so a KB BIOS switch to flatpanel will go OK... */ - nm_crtc_center(target); + nm_crtc_center(target, crt_only); } /* update driver's mode store */ diff --git a/src/add-ons/accelerants/neomagic/engine/nm_crtc.c b/src/add-ons/accelerants/neomagic/engine/nm_crtc.c index 71111b6100..6e3bf942d4 100644 --- a/src/add-ons/accelerants/neomagic/engine/nm_crtc.c +++ b/src/add-ons/accelerants/neomagic/engine/nm_crtc.c @@ -504,7 +504,7 @@ status_t nm_crtc_set_display_start(uint32 startadd,uint8 bpp) } /* setup centering mode for current internal or simultaneous flatpanel mode */ -status_t nm_crtc_center(display_mode target) +status_t nm_crtc_center(display_mode target, bool crt_only) { /* note: * NM2070 apparantly doesn't support horizontal centering this way... */ @@ -521,56 +521,59 @@ status_t nm_crtc_center(display_mode target) ctrl2 = ctrl3 = 0x00; /* calculate offsets for centering if prudent */ - if (target.timing.h_display < si->ps.panel_width) + if (!crt_only) { - hoffset = (si->ps.panel_width - target.timing.h_display); - /* adjust for register contraints: - * horizontal center granularity is 16 pixels */ - hoffset = ((hoffset >> 4) - 1); - /* turn on horizontal centering? */ - ctrl3 = 0x10; - } - - if (target.timing.v_display < si->ps.panel_height) - { - voffset = (si->ps.panel_height - target.timing.v_display); - /* adjust for register contraints: - * vertical center granularity is 2 pixels */ - voffset = ((voffset >> 1) - 2); - /* turn on vertical centering? */ - ctrl2 = 0x01; - } - - switch(target.timing.h_display) - { - case 640: - hcent1 = hoffset; - vcent3 = voffset; - break; - case 800: - hcent2 = hoffset; - switch(target.timing.v_display) + if (target.timing.h_display < si->ps.panel_width) { - case 480: - //Linux fixme: check this out... + hoffset = (si->ps.panel_width - target.timing.h_display); + /* adjust for register contraints: + * horizontal center granularity is 16 pixels */ + hoffset = ((hoffset >> 4) - 1); + /* turn on horizontal centering? */ + ctrl3 = 0x10; + } + + if (target.timing.v_display < si->ps.panel_height) + { + voffset = (si->ps.panel_height - target.timing.v_display); + /* adjust for register contraints: + * vertical center granularity is 2 pixels */ + voffset = ((voffset >> 1) - 2); + /* turn on vertical centering? */ + ctrl2 = 0x01; + } + + switch(target.timing.h_display) + { + case 640: + hcent1 = hoffset; vcent3 = voffset; break; - case 600: - vcent4 = voffset; + case 800: + hcent2 = hoffset; + switch(target.timing.v_display) + { + case 480: + //Linux fixme: check this out... + vcent3 = voffset; + break; + case 600: + vcent4 = voffset; + break; + } + break; + case 1024: + hcent5 = hoffset; + vcent5 = voffset; + break; + case 1280: + /* this mode equals the largest possible panel on the newest chip: + * so no centering needed here. */ + break; + default: + //fixme?: block non-standard modes? for now: not centered. break; } - break; - case 1024: - hcent5 = hoffset; - vcent5 = voffset; - break; - case 1280: - /* this mode equals the largest possible panel on the newest chip: - * so no centering needed here. */ - break; - default: - //fixme?: block non-standard modes? for now: not centered. - break; } /* now program the card's registers */ diff --git a/src/add-ons/accelerants/neomagic/engine/nm_general.c b/src/add-ons/accelerants/neomagic/engine/nm_general.c index 72be461cd5..e3f6ef9bc0 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-12 running.\n")); + LOG(1,("POWERUP: Neomagic (open)BeOS Accelerant 0.06-13 running.\n")); /* detect card type and power it up */ switch(CFGR(DEVID)) diff --git a/src/add-ons/accelerants/neomagic/engine/nm_proto.h b/src/add-ons/accelerants/neomagic/engine/nm_proto.h index 95054996ee..775dbd924a 100644 --- a/src/add-ons/accelerants/neomagic/engine/nm_proto.h +++ b/src/add-ons/accelerants/neomagic/engine/nm_proto.h @@ -41,7 +41,7 @@ status_t nm_crtc_set_timing(display_mode target, bool crt_only); status_t nm_crtc_depth(int mode); status_t nm_crtc_set_display_start(uint32 startadd,uint8 bpp); status_t nm_crtc_set_display_pitch(void); -status_t nm_crtc_center(display_mode target); +status_t nm_crtc_center(display_mode target, bool crt_only); status_t nm_crtc_dpms(bool, bool, bool); status_t nm_crtc_dpms_fetch(bool*, bool*, bool*);