From 1263890952d47c2041d31a3510b5f773c5e1b1ca Mon Sep 17 00:00:00 2001
From: Rudolf Cornelissen
Date: Sat, 31 Jan 2004 16:21:14 +0000
Subject: [PATCH] added output follows monitor feature
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6446 a95241bf-73f2-0310-859d-f6bbb57e9c96
---
.../accelerants/nvidia/SetDisplayMode.c | 67 +++++++++++++------
.../accelerants/nvidia/engine/nv_dac.c | 1 +
.../accelerants/nvidia/engine/nv_dac2.c | 1 +
.../accelerants/nvidia/engine/nv_general.c | 2 +-
.../drivers/graphics/nvidia/UPDATE.html | 6 +-
5 files changed, 54 insertions(+), 23 deletions(-)
diff --git a/src/add-ons/accelerants/nvidia/SetDisplayMode.c b/src/add-ons/accelerants/nvidia/SetDisplayMode.c
index 89ff744aeb..5d4eb17530 100644
--- a/src/add-ons/accelerants/nvidia/SetDisplayMode.c
+++ b/src/add-ons/accelerants/nvidia/SetDisplayMode.c
@@ -52,6 +52,7 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set)
status_t result;
uint32 startadd,startadd_right;
bool display, h, v;
+ bool crt1, crt2, cross;
/* Adjust mode to valid one and fail if invalid */
target /*= bounds*/ = *mode_to_set;
@@ -184,26 +185,30 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set)
/*work out where the "right" screen starts*/
startadd_right = startadd + (target.timing.h_display * (colour_depth1 >> 3));
- /* set the outputs if possible */
- if (si->ps.secondary_head)
+ /* detect which connectors have a CRT connected */
+ crt1 = nv_dac_crt_connected();
+ crt2 = nv_dac2_crt_connected();
+ /* connect outputs 'straight-through' */
+ if (crt1)
{
- /* fixme: test... (do also for singlehead modes!) */
- nv_dac_crt_connected();
- nv_dac2_crt_connected();
-
- switch (target.flags & DUALHEAD_BITS)
- {
- case DUALHEAD_ON:
- case DUALHEAD_CLONE:
- /* connect outputs straight-through */
- nv_general_output_select(false);
- break;
- case DUALHEAD_SWITCH:
- /* cross-connect outputs */
- nv_general_output_select(true);
- break;
- }
+ /* connector1 is used as primary output */
+ cross = false;
}
+ else
+ {
+ if (crt2)
+ /* connector2 is used as primary output */
+ cross = true;
+ else
+ /* no CRT detected: assume connector1 is used as primary output */
+ cross = false;
+ }
+ /* set output connectors assignment if possible */
+ if ((target.flags & DUALHEAD_BITS) == DUALHEAD_SWITCH)
+ /* invert output assignment in switch mode */
+ nv_general_output_select(!cross);
+ else
+ nv_general_output_select(cross);
/* Tell card what memory to display */
switch (target.flags & DUALHEAD_BITS)
@@ -264,8 +269,30 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set)
/* set the timing */
nv_crtc_set_timing(target);
- /* connect outputs straight-through */
- if (si->ps.secondary_head) nv_general_output_select(false);
+ /* connect output */
+ if (si->ps.secondary_head)
+ {
+ /* detect which connectors have a CRT connected */
+ crt1 = nv_dac_crt_connected();
+ crt2 = nv_dac2_crt_connected();
+ /* connect outputs 'straight-through' */
+ if (crt1)
+ {
+ /* connector1 is used as primary output */
+ cross = false;
+ }
+ else
+ {
+ if (crt2)
+ /* connector2 is used as primary output */
+ cross = true;
+ else
+ /* no CRT detected: assume connector1 is used as primary output */
+ cross = false;
+ }
+ /* set output connectors assignment if possible */
+ nv_general_output_select(cross);
+ }
//fixme: shut-off the videoPLL if it exists...
}
diff --git a/src/add-ons/accelerants/nvidia/engine/nv_dac.c b/src/add-ons/accelerants/nvidia/engine/nv_dac.c
index 5d107e2439..eb72d371a4 100644
--- a/src/add-ons/accelerants/nvidia/engine/nv_dac.c
+++ b/src/add-ons/accelerants/nvidia/engine/nv_dac.c
@@ -18,6 +18,7 @@ bool nv_dac_crt_connected(void)
uint32 output, dac;
bool present;
+//fixme? checkout NV11...
/* save output connector setting */
output = DACR(OUTPUT);
/* save DAC state */
diff --git a/src/add-ons/accelerants/nvidia/engine/nv_dac2.c b/src/add-ons/accelerants/nvidia/engine/nv_dac2.c
index fd8a930bdc..73060532f2 100644
--- a/src/add-ons/accelerants/nvidia/engine/nv_dac2.c
+++ b/src/add-ons/accelerants/nvidia/engine/nv_dac2.c
@@ -16,6 +16,7 @@ bool nv_dac2_crt_connected()
uint32 output, dac;
bool present;
+//fixme? checkout NV11...
/* save output connector setting */
output = DAC2R(OUTPUT);
/* save DAC state */
diff --git a/src/add-ons/accelerants/nvidia/engine/nv_general.c b/src/add-ons/accelerants/nvidia/engine/nv_general.c
index 01df4e8697..2e9861a257 100644
--- a/src/add-ons/accelerants/nvidia/engine/nv_general.c
+++ b/src/add-ons/accelerants/nvidia/engine/nv_general.c
@@ -80,7 +80,7 @@ status_t nv_general_powerup()
{
status_t status;
- LOG(1,("POWERUP: nVidia (open)BeOS Accelerant 0.08-10 running.\n"));
+ LOG(1,("POWERUP: nVidia (open)BeOS Accelerant 0.08-11 running.\n"));
/* preset no laptop */
si->ps.laptop = false;
diff --git a/src/add-ons/kernel/drivers/graphics/nvidia/UPDATE.html b/src/add-ons/kernel/drivers/graphics/nvidia/UPDATE.html
index f316bc02d4..6dc828a19b 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 @@
Changes done for each driverversion:
-head (0.08-10, Rudolf)
+head (0.08-11, Rudolf)
- Fixed GeForceFX 5600 and FX 5700 monitor 'refresh out of range' / shutoff fault. nVidia changed the pixelPLL for the NV31 and NV36;
- Fixed acceleration engine restrictions code to adhere to GeForceFX 5600 restrictions: those are still NV20 style for this card;
@@ -21,7 +21,9 @@
- Added dualhead support for 8- and 15bit colordepths;
- Fixed move_display distortions in virtualscreens especially visible in 8-bit colordepth (for both heads);
- Added 'overlay follows head' for dualhead stretch and switch modes: if more than half the overlay output window is on a screen, that screen gets the overlay output;
-
- Added dualhead switch mode.
+
- Added dualhead switch mode (except for NV11 cards as they do not have output connector switching capability);
+
- Added monitor presence detection for both monitor output connectors on dualhead cards (analog type signals only);
+
- Added 'output follows monitor' for all modes: it does not matter on which connector you connect your monitor, the output will go there after setting a mode; like the card's BIOS does (except for NV11 cards as they do not have output connector switching capability).
nv_driver 0.07 (Rudolf)