Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

MULTIPLE DISPLAY WITH NVIDIA SURROUND OVER DIFFERENT MONITORS

Discussion in 'General Graphics' started by ASIM-SENYUVA, Dec 18, 2018.

  1. ASIM-SENYUVA

    ASIM-SENYUVA

    Joined:
    Apr 29, 2013
    Posts:
    90
    Hello.

    I have 6 monitors for our unity3d application. 3 of them has Nvidia surround and others stand alone. The windows can see all monitors with monitor ID. (dual Nvidia 1080 - 2 way SLI)

    our setup
    • 3 monitor has Nvidia surround ( display 1 - main monitor ) ( connected as a given picture - option 1)
    • 1 accessory display
    • 1 monitor connected via mainboard hdmi socket ( not graphics card - CPU )
    • 1 monitor connected with ( hdmı to USB converter - CPU)

    NVidia GTX 1080 series not accepted more than 1 accessory display. Because of this reason, we can not use an additional 2 display over graphics card. Our solution use mainboard and HDMI to USB converter for this requirement. Windows can see all monitor and unity3d detect all of them. But when I try to activate the monitors HDMI to USB one not activated if surround enabled. When I disable surround, I can activate all displays.

    On the other hand, I can see displays.legth are an equal exact count of the connected monitor when Nvidia surround activated. We still try to find a solution to this issue but in my mind, I want to ask something.

    for example.

    I apply 4 monitor surround and get 7680x1080p resolution. In this case, my first display resolution is 7680x1080. I want to assign 5760*1080 to my first 3 monitors and another 1920x1080 to another monitor. Like below picture. Any suggestion

    note: we are developing Windows Application with unity3d
    upload_2018-12-18_21-2-38.png

    upload_2018-12-18_21-7-57.png


    Surround Settings

    upload_2018-12-18_20-48-58.png
     
  2. ASIM-SENYUVA

    ASIM-SENYUVA

    Joined:
    Apr 29, 2013
    Posts:
    90
    spend many hours an setup like that

    3 monitor surround
    1 monitor accessory
    1 monitor Intel Graphics
    1 monitor USB - HDMI

    we get signals from all monitors from windows side. There is one trick here. I wrote an application with unity for activating displays. If USB -HDMI monitor is the main display from the windows side. unity can activate it. on the other hand, if I choose to surround display to main display unity3d cannot activate it but it detects. I call display.activate it runs but USB-HDMI one show desktop only. on the other hand display.activate returns true. my code below


    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.UI;
    5.  
    6. public class InitController : MonoBehaviour
    7. {
    8.     public Text txtDisp1;
    9.     public Text txtDisp2;
    10.     public Text txtDisp3;
    11.     public Text txtDisp4;
    12.     public Text txtDisp5;
    13.     public Text txtDisp6;
    14.     public Text txtDisp7;
    15.     public Text txtDisp8;
    16.  
    17.     public Text txtLOG;
    18.     public Text txtConnected;
    19.  
    20.     // Start is called before the first frame update
    21.     void Start()
    22.     {
    23.        
    24.  
    25.         if (Display.displays.Length > 1)
    26.             Display.displays[1].Activate();
    27.         if (Display.displays.Length > 2)
    28.             Display.displays[2].Activate();
    29.         if (Display.displays.Length > 3)
    30.             Display.displays[3].Activate();
    31.         if (Display.displays.Length > 4)
    32.             Display.displays[4].Activate();
    33.         if (Display.displays.Length > 5)
    34.             Display.displays[5].Activate();
    35.         if (Display.displays.Length > 6)
    36.             Display.displays[6].Activate();
    37.         if (Display.displays.Length > 7)
    38.             Display.displays[7].Activate();
    39.  
    40.         txtConnected.text = "displays connected: " + Display.displays.Length;
    41.  
    42.         txtDisp2.text = "Display 2" + " : " + Display.displays[1].renderingWidth.ToString() + "x" + Display.displays[1].renderingHeight.ToString();
    43.         txtDisp3.text = "Display 3" + " : " + Display.displays[2].renderingWidth.ToString() + "x" + Display.displays[2].renderingHeight.ToString();
    44.         txtDisp4.text = "Display 4" + " : " + Display.displays[3].renderingWidth.ToString() + "x" + Display.displays[3].renderingHeight.ToString();
    45.         txtDisp5.text = "Display 5" + " : " + Display.displays[4].renderingWidth.ToString() + "x" + Display.displays[4].renderingHeight.ToString();
    46.         txtDisp6.text = "Display 6" + " : " + Display.displays[5].renderingWidth.ToString() + "x" + Display.displays[5].renderingHeight.ToString();
    47.         txtDisp7.text = "Display 7" + " : " + Display.displays[6].renderingWidth.ToString() + "x" + Display.displays[6].renderingHeight.ToString();
    48.         txtDisp8.text = "Display 8" + " : " + Display.displays[7].renderingWidth.ToString() + "x" + Display.displays[7].renderingHeight.ToString();
    49.  
    50.  
    51.         Display.onDisplaysUpdated += OnDisplaysUpdated;
    52.  
    53.  
    54.     }
    55.  
    56.     void OnDisplaysUpdated()
    57.     {
    58.         txtLOG.text = "New Display Connected. Show Display Option Menu....";
    59.  
    60.     }
    61.  
    62.     public void ActivateDisp2()
    63.     {
    64.         if (Display.displays.Length > 1)
    65.             Display.displays[1].Activate();
    66.  
    67.         if (Display.displays.Length > 1)
    68.             txtLOG.text = " Monitor 1 active status " + Display.displays[1].active;
    69.     }
    70.  
    71.     public void ActivateDisp3()
    72.     {
    73.         if (Display.displays.Length > 2)
    74.             Display.displays[2].Activate(800, 600, 60);
    75.  
    76.         if (Display.displays.Length > 2)
    77.             txtLOG.text = " Monitor 2 active status " + Display.displays[2].active;
    78.     }
    79.  
    80.     public void ActivateDisp4()
    81.     {
    82.         if (Display.displays.Length > 3)
    83.             Display.displays[3].Activate();
    84.  
    85.         if (Display.displays.Length > 3)
    86.             txtLOG.text = " Monitor 3 active status " + Display.displays[3].active;
    87.     }
    88.  
    89.     public void ActivateDisp5()
    90.     {
    91.         if (Display.displays.Length > 4)
    92.             Display.displays[4].Activate();
    93.  
    94.         if (Display.displays.Length > 4)
    95.             txtLOG.text = " Monitor 4 active status " + Display.displays[4].active;
    96.     }
    97.  
    98.     public void ActivateDisp6()
    99.     {
    100.         if (Display.displays.Length > 5)
    101.             Display.displays[5].Activate();
    102.  
    103.         if (Display.displays.Length > 5)
    104.             txtLOG.text = " Monitor 5 active status " + Display.displays[5].active;
    105.     }
    106.  
    107.     public void ActivateDisp7()
    108.     {
    109.         if (Display.displays.Length > 6)
    110.             Display.displays[6].Activate();
    111.  
    112.         if (Display.displays.Length > 6)
    113.             txtLOG.text = " Monitor 6 active status " + Display.displays[6].active;
    114.     }
    115.  
    116.     public void ActivateDisp8()
    117.     {
    118.         if (Display.displays.Length > 7)
    119.             Display.displays[7].Activate();
    120.  
    121.         if (Display.displays.Length > 7)
    122.             txtLOG.text = " Monitor 7 active status " + Display.displays[7].active;
    123.     }
    124. }
    125.  
     
  3. StevenB2

    StevenB2

    Joined:
    Mar 17, 2014
    Posts:
    3
    I know this is an old thread but my team and I have actually found a work around to this issue. After a few days of beating our heads against the wall, we think we've solved it.

    *DISCLAIMER*
    Please note that this isn't an "official" fix but a work-around to allow spanned screens with up to four extra screens. This fix works specifically for hardware you can control, i.e. an installation, and doesn't necessarily translate to consumer facing games/apps. I am not endorsed by nVidia and this solution was not provided by nVidia.
    *DISCLAIMER*

    Now that that's out of the way, here's what happened for us.

    We had a client who commissioned an experience that ran through a touch table comprised of two screens, spanned to make one, with a IR sensor touch bar. The experience also included four projectors displaying content on the walls around the table from floor to ceiling. When we built our initial set up, there were no issues having the spanned displays on the table as well as four external monitors so we didn't worry too much about it. However, whenever we had a separate hardware issue that required attention, we noticed that we couldn't get the displays to revert back to the original set up, there was no option to span the original displays, and if we enabled SLI and did so, we lost the option to run other screens from the second card. This was a problem.

    We tried everything, but as you know the nVidia documentation says explicitly that you can not have more than one external screen with spanned displays. We were confused due to the fact that it just worked before. So we built a separate PC to run some tests and found the work-around.

    First, remove the SLI bridge between the cards. This sounds counterintuitive but we've actually seen a performance increase when removing the SLI bridge on the 1080 TI cards we are using for the experience. Plus, this is how our solution currently works. Once this is done, plug the displays you want to span into the top most card, the primary one, and unplug the other displays from your secondary card.

    Second, Go into the Device Manager and find your second GPU. It should be located under the Display adapters and should be the second option. Right click it and choose "disable device".

    Third, open up nVidia Control Panel and go to the "Enable SLI, Configure Surround, PhysX" tab. Enable surround and configure the screens you want to surround there. We are currently using two screens in surround and haven't tested with a higher number yet. but this has worked for us consistently. Apply the changes once you are done and try resetting the computer to make sure your changes stay.

    Fourth, Once the computer is back up, go back to the device manager and re-enable the second card. Reopen nVidia Control Panel and go to "Setup Multiple Displays". Plug the extra displays you want into the second card one-by-one, ensuring they are operating correctly. Position the screens as you want them to appear and set your spanned screens to be the primary display. Apply changes.

    Fifth, restart the computer and make sure your configuration comes back as intended.

    I'm not sure if this would help you at all, but in doing a ton of research I couldn't find anything like the setup we ended up utilizing. Hopefully, if someone else has this issue it will help. Good luck developing.
     
  4. ASIM-SENYUVA

    ASIM-SENYUVA

    Joined:
    Apr 29, 2013
    Posts:
    90
    Thank you for the information . I will test it.