diff --git a/headers/private/graphics/nvidia/DriverInterface.h b/headers/private/graphics/nvidia/DriverInterface.h index 98083a3059..c50bf205ab 100644 --- a/headers/private/graphics/nvidia/DriverInterface.h +++ b/headers/private/graphics/nvidia/DriverInterface.h @@ -5,7 +5,7 @@ Other authors: Mark Watson; Apsed; - Rudolf Cornelissen 10/2002-8/2009. + Rudolf Cornelissen 10/2002-10/2009. */ #ifndef DRIVERINTERFACE_H @@ -89,12 +89,9 @@ enum { NV06, NV10, NV11, - NV11M, NV15, NV17, - NV17M, NV18, - NV18M, NV20, NV25, NV28, diff --git a/headers/private/graphics/nvidia/nv_macros.h b/headers/private/graphics/nvidia/nv_macros.h index 590c9ec2a3..7065ba03f6 100644 --- a/headers/private/graphics/nvidia/nv_macros.h +++ b/headers/private/graphics/nvidia/nv_macros.h @@ -650,6 +650,7 @@ #define NVDAC_PIXPLLC 0x00680508 #define NVDAC_PLLSEL 0x0068050c #define NVDAC_NV30_PLLSETUP 0x00680524 +#define NVDAC_NV11_DITHER 0x00680528 #define NVDAC_OUTPUT 0x0068052c #define NVDAC_PIXPLLC2 0x00680578 #define NVDAC_NV40_PLLSEL2 0x00680580 @@ -672,9 +673,16 @@ #define NVDAC_FP_HSYNC_E 0x00680830 #define NVDAC_FP_HVALID_S 0x00680834 #define NVDAC_FP_HVALID_E 0x00680838 +#define NVDAC_FP_DITHER 0x0068083c #define NVDAC_FP_CHKSUM 0x00680840 #define NVDAC_FP_TST_CTRL 0x00680844 #define NVDAC_FP_TG_CTRL 0x00680848 +#define NVDAC_FP_DITH_PATT1 0x00680850 +#define NVDAC_FP_DITH_PATT2 0x00680854 +#define NVDAC_FP_DITH_PATT3 0x00680858 +#define NVDAC_FP_DITH_PATT4 0x0068085c +#define NVDAC_FP_DITH_PATT5 0x00680860 +#define NVDAC_FP_DITH_PATT6 0x00680864 #define NVDAC_FP_DEBUG0 0x00680880 #define NVDAC_FP_DEBUG1 0x00680884 #define NVDAC_FP_DEBUG2 0x00680888 diff --git a/src/add-ons/accelerants/nvidia/engine/nv_dac.c b/src/add-ons/accelerants/nvidia/engine/nv_dac.c index 11f75c2107..7c4673d44b 100644 --- a/src/add-ons/accelerants/nvidia/engine/nv_dac.c +++ b/src/add-ons/accelerants/nvidia/engine/nv_dac.c @@ -1,6 +1,6 @@ /* program the DAC */ /* Author: - Rudolf Cornelissen 12/2003-9/2009 + Rudolf Cornelissen 12/2003-10/2009 */ #define MODULE_BIT 0x00010000 @@ -103,6 +103,47 @@ status_t nv_dac_mode(int mode,float brightness) return B_OK; } +/* enable/disable dithering */ +status_t nv_dac_dither(bool dither) +{ + /* older cards can't do dithering */ + if ((si->ps.card_type != NV11) && !si->ps.secondary_head) return B_ERROR; + + if (dither) { + LOG(4,("DAC: enabling dithering\n")); + + if (si->ps.card_type == NV11) { + /* NV11 apparantly has a fixed dithering pattern */ + + /* enable dithering */ + DACW(NV11_DITHER, (DACR(NV11_DITHER) | 0x00010000)); + } else { + /* setup dithering pattern */ + DACW(FP_DITH_PATT1, 0xe4e4e4e4); + DACW(FP_DITH_PATT2, 0xe4e4e4e4); + DACW(FP_DITH_PATT3, 0xe4e4e4e4); + DACW(FP_DITH_PATT4, 0x44444444); + DACW(FP_DITH_PATT5, 0x44444444); + DACW(FP_DITH_PATT6, 0x44444444); + + /* enable dithering */ + DACW(FP_DITHER, (DACR(FP_DITHER) | 0x00000001)); + } + } else { + LOG(4,("DAC: disabling dithering\n")); + + if (si->ps.card_type == NV11) { + /* disable dithering */ + DACW(NV11_DITHER, (DACR(NV11_DITHER) & ~0x00010000)); + } else { + /* disable dithering */ + DACW(FP_DITHER, (DACR(FP_DITHER) & ~0x00000001)); + } + } + + return B_OK; +} + /*program the DAC palette using the given r,g,b values*/ status_t nv_dac_palette(uint8 r[256],uint8 g[256],uint8 b[256]) { diff --git a/src/add-ons/accelerants/nvidia/engine/nv_general.c b/src/add-ons/accelerants/nvidia/engine/nv_general.c index b268ab3f33..b78535a492 100644 --- a/src/add-ons/accelerants/nvidia/engine/nv_general.c +++ b/src/add-ons/accelerants/nvidia/engine/nv_general.c @@ -1,7 +1,7 @@ /* Authors: Mark Watson 12/1999, Apsed, - Rudolf Cornelissen 10/2002-9/2009 + Rudolf Cornelissen 10/2002-10/2009 tst.. */ @@ -92,7 +92,7 @@ status_t nv_general_powerup() { status_t status; - LOG(1,("POWERUP: Haiku nVidia Accelerant 1.05 running.\n")); + LOG(1,("POWERUP: Haiku nVidia Accelerant 1.06 running.\n")); /* log VBLANK INT usability status */ if (si->ps.int_assigned) @@ -1830,6 +1830,12 @@ static status_t nv_general_bios_to_powergraphics() NV_REG32(NV32_PFB_CLS_PAGE2) &= 0xffff7fff; } + /* enable dithering for internal laptop panels only (those have only 18bit colordepth sometimes) + * note: + * dithering is only supported on digitally connected flatpanels. */ + //fixme: how about DAC2?? (still implement and test..) + if (si->ps.laptop && (si->ps.monitors & CRTC1_TMDS)) nv_dac_dither(true); + /* tweak card GPU-core and RAM speeds if requested (hoping we'll survive)... */ if (si->settings.gpu_clk) { diff --git a/src/add-ons/accelerants/nvidia/engine/nv_proto.h b/src/add-ons/accelerants/nvidia/engine/nv_proto.h index 047eb7bbed..048b3ec00d 100644 --- a/src/add-ons/accelerants/nvidia/engine/nv_proto.h +++ b/src/add-ons/accelerants/nvidia/engine/nv_proto.h @@ -50,6 +50,7 @@ void dump_pins(void); /* DAC functions */ bool nv_dac_crt_connected(void); status_t nv_dac_mode(int,float); +status_t nv_dac_dither(bool dither); status_t nv_dac_palette(uint8*,uint8*,uint8*); status_t nv_dac_pix_pll_find(display_mode target,float * result,uint8 *,uint8 *,uint8 *, uint8); status_t nv_dac_set_pix_pll(display_mode target); diff --git a/src/add-ons/kernel/drivers/graphics/nvidia/UPDATE.html b/src/add-ons/kernel/drivers/graphics/nvidia/UPDATE.html index 13a827090c..862d8ceeb8 100644 --- a/src/add-ons/kernel/drivers/graphics/nvidia/UPDATE.html +++ b/src/add-ons/kernel/drivers/graphics/nvidia/UPDATE.html @@ -4,7 +4,7 @@