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)

nv_driver 0.07 (Rudolf)