panel modeline updates including refreshrate update

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7432 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rudolf Cornelissen
2004-05-06 14:07:06 +00:00
parent b66afdfa2d
commit 16fc5a3011
6 changed files with 101 additions and 26 deletions
@@ -108,20 +108,57 @@ status_t nv_crtc_set_timing(display_mode target)
/* setup fixed modeline for flatpanel if connected and active */
if (si->ps.tmds1_active)
{
display_mode p1, p2;
bool pan1, pan2;
LOG(2,("CRTC: DFP active: tuning modeline\n"));
get_panel_modelines(&p1, &p2, &pan1, &pan2);
/* horizontal timing */
//fixme (?): maybe we need real modeline calculations here...
//testing (640x480): total = 135% is too much, 120% to small...
//total = display + 160 equals panel modeline: but must be smaller...?
target.timing.h_total = target.timing.h_display + 152;//160;//128
target.timing.h_sync_start = target.timing.h_total - 136;//144;//112
target.timing.h_sync_end = target.timing.h_total - 40;//48;//16
// target.timing.h_total = target.timing.h_display + 152;//160;//128
// target.timing.h_sync_start = target.timing.h_total - 136;//144;//112
// target.timing.h_sync_end = target.timing.h_total - 40;//48;//16
//adaptive to panel: fixme: test on 4:3 and 16:10 panels!
target.timing.h_sync_start =
((uint16)((p1.timing.h_sync_start / ((float)p1.timing.h_display)) *
target.timing.h_display)) & 0xfff8;
target.timing.h_sync_end =
((uint16)((p1.timing.h_sync_end / ((float)p1.timing.h_display)) *
target.timing.h_display)) & 0xfff8;
target.timing.h_total =
((uint16)((p1.timing.h_total / ((float)p1.timing.h_display)) *
target.timing.h_display)) & 0xfff8;
if (target.timing.h_sync_start == target.timing.h_display)
target.timing.h_sync_start += 8;
if (target.timing.h_sync_end == target.timing.h_total)
target.timing.h_sync_end -= 8;
/* vertical timing */
target.timing.v_total = target.timing.v_display + 6;
target.timing.v_sync_start = target.timing.v_total - 3;
target.timing.v_sync_end = target.timing.v_total - 2;
// target.timing.v_total = target.timing.v_display + 6;
// target.timing.v_sync_start = target.timing.v_total - 3;
// target.timing.v_sync_end = target.timing.v_total - 2;
target.timing.v_sync_start =
((uint16)((p1.timing.v_sync_start / ((float)p1.timing.v_display)) *
target.timing.v_display));
target.timing.v_sync_end =
((uint16)((p1.timing.v_sync_end / ((float)p1.timing.v_display)) *
target.timing.v_display));
target.timing.v_total =
((uint16)((p1.timing.v_total / ((float)p1.timing.v_display)) *
target.timing.v_display));
if (target.timing.v_sync_start == target.timing.v_display)
target.timing.v_sync_start += 1;
if (target.timing.v_sync_end == target.timing.v_total)
target.timing.v_sync_end -= 1;
/* disable GPU scaling testmode so automatic scaling will be done */
DACW(FP_DEBUG1, 0);
@@ -94,20 +94,57 @@ status_t nv_crtc2_set_timing(display_mode target)
/* setup fixed modeline for flatpanel if connected and active */
if (si->ps.tmds2_active)
{
display_mode p1, p2;
bool pan1, pan2;
LOG(2,("CRTC2: DFP active: tuning modeline\n"));
get_panel_modelines(&p1, &p2, &pan1, &pan2);
/* horizontal timing */
//fixme (?): maybe we need real modeline calculations here...
//testing (640x480): total = 135% is too much, 120% to small...
//total = display + 160 equals panel modeline: but must be smaller...?
target.timing.h_total = target.timing.h_display + 152;//160;//128
target.timing.h_sync_start = target.timing.h_total - 136;//144;//112
target.timing.h_sync_end = target.timing.h_total - 40;//48;//16
// target.timing.h_total = target.timing.h_display + 152;//160;//128
// target.timing.h_sync_start = target.timing.h_total - 136;//144;//112
// target.timing.h_sync_end = target.timing.h_total - 40;//48;//16
//adaptive to panel: fixme: test on 4:3 and 16:10 panels!
target.timing.h_sync_start =
((uint16)((p2.timing.h_sync_start / ((float)p2.timing.h_display)) *
target.timing.h_display)) & 0xfff8;
target.timing.h_sync_end =
((uint16)((p2.timing.h_sync_end / ((float)p2.timing.h_display)) *
target.timing.h_display)) & 0xfff8;
target.timing.h_total =
((uint16)((p2.timing.h_total / ((float)p2.timing.h_display)) *
target.timing.h_display)) & 0xfff8;
if (target.timing.h_sync_start == target.timing.h_display)
target.timing.h_sync_start += 8;
if (target.timing.h_sync_end == target.timing.h_total)
target.timing.h_sync_end -= 8;
/* vertical timing */
target.timing.v_total = target.timing.v_display + 6;
target.timing.v_sync_start = target.timing.v_total - 3;
target.timing.v_sync_end = target.timing.v_total - 2;
// target.timing.v_total = target.timing.v_display + 6;
// target.timing.v_sync_start = target.timing.v_total - 3;
// target.timing.v_sync_end = target.timing.v_total - 2;
target.timing.v_sync_start =
((uint16)((p2.timing.v_sync_start / ((float)p2.timing.v_display)) *
target.timing.v_display));
target.timing.v_sync_end =
((uint16)((p2.timing.v_sync_end / ((float)p2.timing.v_display)) *
target.timing.v_display));
target.timing.v_total =
((uint16)((p2.timing.v_total / ((float)p2.timing.v_display)) *
target.timing.v_display));
if (target.timing.v_sync_start == target.timing.v_display)
target.timing.v_sync_start += 1;
if (target.timing.v_sync_end == target.timing.v_total)
target.timing.v_sync_end -= 1;
/* disable GPU scaling testmode so automatic scaling will be done */
DAC2W(FP_DEBUG1, 0);
@@ -1,6 +1,6 @@
/* program the DAC */
/* Author:
Rudolf Cornelissen 12/2003-4/2004
Rudolf Cornelissen 12/2003-5/2004
*/
#define MODULE_BIT 0x00010000
@@ -143,18 +143,19 @@ status_t nv_dac_set_pix_pll(display_mode target)
float pix_setting, req_pclk;
status_t result;
/* fix a DVI or laptop flatpanel to 60Hz refresh! */
/* fix a DVI or laptop flatpanel to 62Hz refresh!
* (we can't risk getting below 60.0Hz as some panels shut-off then!) */
/* Note:
* The pixelclock drives the flatpanel modeline, not the CRTC modeline. */
if (si->ps.tmds1_active)
{
LOG(4,("DAC: Fixing DFP refresh to 60Hz!\n"));
LOG(4,("DAC: Fixing DFP refresh to 62Hz!\n"));
/* readout the panel's modeline to determine the needed pixelclock */
target.timing.pixel_clock = (
((DACR(FP_HTOTAL) & 0x0000ffff) + 1) *
((DACR(FP_VTOTAL) & 0x0000ffff) + 1) *
60) / 1000;
62) / 1000;
}
req_pclk = (target.timing.pixel_clock)/1000.0;
@@ -1,6 +1,6 @@
/* program the secondary DAC */
/* Author:
Rudolf Cornelissen 12/2003-4/2004
Rudolf Cornelissen 12/2003-5/2004
*/
#define MODULE_BIT 0x00001000
@@ -149,18 +149,19 @@ status_t nv_dac2_set_pix_pll(display_mode target)
float pix_setting, req_pclk;
status_t result;
/* fix a DVI or laptop flatpanel to 60Hz refresh! */
/* fix a DVI or laptop flatpanel to 62Hz refresh!
* (we can't risk getting below 60.0Hz as some panels shut-off then!) */
/* Note:
* The pixelclock drives the flatpanel modeline, not the CRTC modeline. */
if (si->ps.tmds2_active)
{
LOG(4,("DAC2: Fixing DFP refresh to 60Hz!\n"));
LOG(4,("DAC2: Fixing DFP refresh to 62Hz!\n"));
/* readout the panel's modeline to determine the needed pixelclock */
target.timing.pixel_clock = (
((DAC2R(FP_HTOTAL) & 0x0000ffff) + 1) *
((DAC2R(FP_VTOTAL) & 0x0000ffff) + 1) *
60) / 1000;
62) / 1000;
}
req_pclk = (target.timing.pixel_clock)/1000.0;
@@ -80,7 +80,7 @@ status_t nv_general_powerup()
{
status_t status;
LOG(1,("POWERUP: nVidia (open)BeOS Accelerant 0.10-19 running.\n"));
LOG(1,("POWERUP: nVidia (open)BeOS Accelerant 0.10-20 running.\n"));
/* preset no laptop */
si->ps.laptop = false;
@@ -4,13 +4,12 @@
</head>
<body>
<p><h2>Changes done for each driverversion:</h2></p>
<p><h1>head (0.10-18), (Rudolf)</h1></p>
<p><h1>head (0.10-20), (Rudolf)</h1></p>
<ul>
<li>Implemented laptop internal flatpanel presence and native resolution detection;
<li>Implemented external DVI flatpanel(s) presence and native resolution detection;
<li>Added flatpanel(s) refreshrate protection: it(they) is(are) always kept at 60Hz refresh;
<li>Added flatpanel(s) refreshrate protection: it(they) is(are) always kept at 62Hz refresh;
<li>Added flatpanel specific CRTC modeline and DFP modeline tuning: DVI connected panels work now on both heads (if applicable);
<li>Fixed fullscreen overlay on DVI panels;
<li>Added aspect correction programming for flatpanels: corrects if mode aspect differs too much from panel aspect;
<li>Fixed acceleration engine management regarding sync_to_token: no more updating glitches should occur now;
<li>Added recognition for GeForce4 MX 4000, GeForceFX 5700LE and GeForceFX 5700VE cards; also modified a few others to be more correct;