falahati / HeliosDisplayManagement

An open source display profile management program for Windows with support for NVIDIA Surround
GNU General Public License v2.0
265 stars 26 forks source link

Toggling TO a nVidia Surround Profile. #2

Closed robibla closed 6 years ago

robibla commented 7 years ago

I have successfully captured two profiles:

  1. An extended display profile, with 3 x 27" monitors and 1x 4k screen above.
  2. An nVidia surround profile consisting of the 3 x 27" inch monitors as one giant display

Both of the profiles have images that look correct according to the screen layout.

I can switch to the "extended" profile perfectly, however; I cannot load the nVidia surround profile successfully. It seems that the app has problems with nVidia Surround?

Thanks!

falahati commented 7 years ago

Hey,

I need your help with reproducing this problem. If it is possible for you, please follow this post:

  1. Please provide me with this file:

    %appdata%\HeliosDisplayManagement.Shared\DisplayProfiles_1.0.xml
  2. And while in surround mode, execute the attached .exe file in this post, navigate to "DeviceContext" by pressing 0 and then Enter and later on navigate to "DeviceContext: Connected Displays" by pressing 1 and then Enter. This will show you a list of currently connected devices. Copy paste the output here. WindowsDisplayAPISample.zip

  3. Also please mention your Windows version and platform as well as your Nvidia control panel version.

SHWotever commented 7 years ago

Hi !

I have the same case,

I see that the projects is quite young but, damn ! I have been waiting for this proper surround toggle for years ! Do not hesitate to ask anything you need I will be happy to provide the info

I my case Nvidia 1060 + 4 screens, one is kept separate of surround mode

Here my saved profiles : DisplayProfiles_1.0.xml.txt

Connected displays when surround is enabled alone :

Display.GetDisplays()
________________________________________________________________________________________________________________________
[0]: {
   Adapter: DisplayAdapter: NVIDIA GeForce GTX 1060 6GB
   CurrentSetting: {Width=5760, Height=1080} Progressive 60hz @ Depth32Bit @ {X=0,Y=0}
   DeviceKey: \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0007
   DeviceName: Generic PnP Monitor
   DevicePath: \\?\DISPLAY#NVS10DE#5&3a6677c5&3&UID5120#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
   DisplayFullName: \\.\DISPLAY1\Monitor0
   DisplayName: \\.\DISPLAY1
   IsAvailable: True
   IsGDIPrimary: True
   IsValid: True
   SavedSetting: {Width=5760, Height=1080} Progressive 60hz @ Depth32Bit @ {X=0,Y=0}
},

Connected displays when surround is enabled and 4th screen extended too :

[0]: {
   Adapter: DisplayAdapter: NVIDIA GeForce GTX 1060 6GB
   CurrentSetting: {Width=5760, Height=1080} Progressive 60hz @ Depth32Bit @ {X=0,Y=0}
   DeviceKey: \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0007
   DeviceName: Generic PnP Monitor
   DevicePath: \\?\DISPLAY#NVS10DE#5&3a6677c5&3&UID5120#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
   DisplayFullName: \\.\DISPLAY1\Monitor0
   DisplayName: \\.\DISPLAY1
   IsAvailable: True
   IsGDIPrimary: True
   IsValid: True
   SavedSetting: {Width=5760, Height=1080} Progressive 60hz @ Depth32Bit @ {X=0,Y=0}
},
[1]: {
   Adapter: DisplayAdapter: NVIDIA GeForce GTX 1060 6GB
   CurrentSetting: {Width=1280, Height=720} Progressive 60hz @ Depth32Bit @ {X=2216,Y=1080}
   DeviceKey: \Registry\Machine\System\CurrentControlSet\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0008
   DeviceName: Generic PnP Monitor
   DevicePath: \\?\DISPLAY#RTK4C54#5&3a6677c5&3&UID4353#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
   DisplayFullName: \\.\DISPLAY2\Monitor0
   DisplayName: \\.\DISPLAY2
   IsAvailable: True
   IsGDIPrimary: False
   IsValid: True
   SavedSetting: {Width=1280, Height=720} Progressive 60hz @ Depth32Bit @ {X=2216,Y=1080}
},

Currently running w10 pro w64 up to date, Nvidia control panel 8.1.970

SHWotever commented 7 years ago

Little update : I've debugged, from what i see, when I apply the defective profile the 4th screen is recognized as surround topology.

I've manually made a mix in the profiles and now I can reload my target topology properly !

So it looks like the problem is definitely into the profile generation, not in the profile application.

Here the modified profile : DisplayProfiles_1.0_workingnow.xml.txt

Hope it will help ;)

Man seriously ... Thanks ! Finally having a tool to switch those damn profiles is magic !

amasover commented 6 years ago

@zegreatclan I adapted your modified profile, and it seems to work great for me. I wrote a gist with instructions as to how I got it working, as well as my own working .xml file.

@falahati Thank you very much for digging into the NVAPI and creating this tool. Those Mosiac functions seem a little rough. You're doing NVidia's work for them...even with the incomplete config generation, your tool works far better than NVidia Control Panel for toggling surround 😃

Zenairo commented 6 years ago

@amasover I attempted to follow your instructions during some downtime for OSVR and couldn't use it to get my display ID's, instead I compiled and used the demo of the NvAPI wrapper @falahati wrote: https://github.com/falahati/NvAPIWrapper

Huge thanks to both of you for the software and guide!

Below is my DisplayProfiles_1.0.xml, hope somebody finds it useful =)

<ArrayOfProfile xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Profile>
    <Name>Windows</Name>
    <Paths>
      <Path>
        <PixelFormat>PixelFormat32Bpp</PixelFormat>
        <Position>
          <X>-2560</X>
          <Y>0</Y>
        </Position>
        <Resolution>
          <Width>2560</Width>
          <Height>1440</Height>
        </Resolution>
        <SourceId>1</SourceId>
        <Targets>
          <PathTarget>
            <DevicePath>\\?\DISPLAY#ACI27EC#5&amp;2e126b7&amp;5&amp;UID4356</DevicePath>
            <DisplayName>ROG PG279Q</DisplayName>
            <FrequencyInMillihertz>165000</FrequencyInMillihertz>
            <Rotation>Identity</Rotation>
            <Scaling>Identity</Scaling>
            <ScanLineOrdering>Progressive</ScanLineOrdering>
          </PathTarget>
        </Targets>
      </Path>
      <Path>
        <PixelFormat>PixelFormat32Bpp</PixelFormat>
        <Position>
          <X>0</X>
          <Y>0</Y>
        </Position>
        <Resolution>
          <Width>2560</Width>
          <Height>1440</Height>
        </Resolution>
        <SourceId>0</SourceId>
        <Targets>
          <PathTarget>
            <DevicePath>\\?\DISPLAY#ACI27EC#5&amp;2e126b7&amp;5&amp;UID4358</DevicePath>
            <DisplayName>ROG PG279Q</DisplayName>
            <FrequencyInMillihertz>165000</FrequencyInMillihertz>
            <Rotation>Identity</Rotation>
            <Scaling>Identity</Scaling>
            <ScanLineOrdering>Progressive</ScanLineOrdering>
          </PathTarget>
        </Targets>
      </Path>
      <Path>
        <PixelFormat>PixelFormat32Bpp</PixelFormat>
        <Position>
          <X>2560</X>
          <Y>0</Y>
        </Position>
        <Resolution>
          <Width>2560</Width>
          <Height>1440</Height>
        </Resolution>
        <SourceId>2</SourceId>
        <Targets>
          <PathTarget>
            <DevicePath>\\?\DISPLAY#ACI27EC#5&amp;2e126b7&amp;5&amp;UID4354</DevicePath>
            <DisplayName>ROG PG279Q</DisplayName>
            <FrequencyInMillihertz>165000</FrequencyInMillihertz>
            <Rotation>Identity</Rotation>
            <Scaling>Identity</Scaling>
            <ScanLineOrdering>Progressive</ScanLineOrdering>
          </PathTarget>
        </Targets>
      </Path>
    </Paths>
  </Profile>
  <Profile>
    <Name>Nvidia</Name>
    <Paths>
      <Path>
        <PixelFormat>PixelFormat32Bpp</PixelFormat>
        <Position>
          <X>0</X>
          <Y>0</Y>
        </Position>
        <Resolution>
          <Width>7680</Width>
          <Height>1440</Height>
        </Resolution>
        <SourceId>0</SourceId>
        <Targets>
          <PathTarget>
            <DevicePath>\\?\DISPLAY#ACI27EC#5&amp;2e126b7&amp;5&amp;UID5120</DevicePath>
            <DisplayName>NV Surround</DisplayName>
            <FrequencyInMillihertz>165000</FrequencyInMillihertz>
            <Rotation>Identity</Rotation>
            <Scaling>Identity</Scaling>
            <ScanLineOrdering>Progressive</ScanLineOrdering>
            <SurroundTopology>
              <AcceleratePrimaryDisplay>true</AcceleratePrimaryDisplay>
              <ApplyWithBezelCorrectedResolution>true</ApplyWithBezelCorrectedResolution>
              <BaseMosaicPanoramic>false</BaseMosaicPanoramic>
              <ColorDepth>32</ColorDepth>
              <Columns>3</Columns>
              <Displays>
                <SurroundTopologyDisplay>
                  <DisplayId>2147881095</DisplayId>
                  <DisplayName>ROG PG279Q</DisplayName>
                  <Overlap>
                    <X>0</X>
                    <Y>0</Y>
                  </Overlap>
                  <PixelShiftType>NoPixelShift</PixelShiftType>
                  <Rotation>Identity</Rotation>
                </SurroundTopologyDisplay>
                <SurroundTopologyDisplay>
                  <DisplayId>2147881093</DisplayId>
                  <DisplayName>ROG PG279Q</DisplayName>
                  <Overlap>
                    <X>-90</X>
                    <Y>0</Y>
                  </Overlap>
                  <PixelShiftType>NoPixelShift</PixelShiftType>
                  <Rotation>Identity</Rotation>
                </SurroundTopologyDisplay>
                <SurroundTopologyDisplay>
                  <DisplayId>2147881089</DisplayId>
                  <DisplayName>ROG PG279Q</DisplayName>
                  <Overlap>
                    <X>-90</X>
                    <Y>0</Y>
                  </Overlap>
                  <PixelShiftType>NoPixelShift</PixelShiftType>
                  <Rotation>Identity</Rotation>
                </SurroundTopologyDisplay>
              </Displays>
              <DriverReloadAllowed>false</DriverReloadAllowed>
              <Frequency>165</Frequency>
              <ImmersiveGaming>true</ImmersiveGaming>
              <Resolution>
                <Width>2560</Width>
                <Height>1440</Height>
              </Resolution>
              <Rows>1</Rows>
            </SurroundTopology>
          </PathTarget>
        </Targets>
      </Path>
    </Paths>
  </Profile>
  <Profile>
    <Name>WinFour</Name>
    <Paths>
      <Path>
        <PixelFormat>PixelFormat32Bpp</PixelFormat>
        <Position>
          <X>0</X>
          <Y>0</Y>
        </Position>
        <Resolution>
          <Width>2560</Width>
          <Height>1440</Height>
        </Resolution>
        <SourceId>1</SourceId>
        <Targets>
          <PathTarget>
            <DevicePath>\\?\DISPLAY#ACI27EC#5&amp;2e126b7&amp;5&amp;UID4358</DevicePath>
            <DisplayName>ROG PG279Q</DisplayName>
            <FrequencyInMillihertz>165000</FrequencyInMillihertz>
            <Rotation>Identity</Rotation>
            <Scaling>Identity</Scaling>
            <ScanLineOrdering>Progressive</ScanLineOrdering>
          </PathTarget>
        </Targets>
      </Path>
      <Path>
        <PixelFormat>PixelFormat32Bpp</PixelFormat>
        <Position>
          <X>-2560</X>
          <Y>0</Y>
        </Position>
        <Resolution>
          <Width>2560</Width>
          <Height>1440</Height>
        </Resolution>
        <SourceId>0</SourceId>
        <Targets>
          <PathTarget>
            <DevicePath>\\?\DISPLAY#ACI27EC#5&amp;2e126b7&amp;5&amp;UID4356</DevicePath>
            <DisplayName>ROG PG279Q</DisplayName>
            <FrequencyInMillihertz>165000</FrequencyInMillihertz>
            <Rotation>Identity</Rotation>
            <Scaling>Identity</Scaling>
            <ScanLineOrdering>Progressive</ScanLineOrdering>
          </PathTarget>
        </Targets>
      </Path>
      <Path>
        <PixelFormat>PixelFormat32Bpp</PixelFormat>
        <Position>
          <X>2560</X>
          <Y>0</Y>
        </Position>
        <Resolution>
          <Width>2560</Width>
          <Height>1440</Height>
        </Resolution>
        <SourceId>2</SourceId>
        <Targets>
          <PathTarget>
            <DevicePath>\\?\DISPLAY#ACI27EC#5&amp;2e126b7&amp;5&amp;UID4354</DevicePath>
            <DisplayName>ROG PG279Q</DisplayName>
            <FrequencyInMillihertz>165000</FrequencyInMillihertz>
            <Rotation>Identity</Rotation>
            <Scaling>Identity</Scaling>
            <ScanLineOrdering>Progressive</ScanLineOrdering>
          </PathTarget>
        </Targets>
      </Path>
      <Path>
        <PixelFormat>PixelFormat32Bpp</PixelFormat>
        <Position>
          <X>5120</X>
          <Y>447</Y>
        </Position>
        <Resolution>
          <Width>1360</Width>
          <Height>768</Height>
        </Resolution>
        <SourceId>3</SourceId>
        <Targets>
          <PathTarget>
            <DevicePath>\\?\DISPLAY#GSM0001#5&amp;2e126b7&amp;5&amp;UID4353</DevicePath>
            <DisplayName>32LV2400</DisplayName>
            <FrequencyInMillihertz>60015</FrequencyInMillihertz>
            <Rotation>Identity</Rotation>
            <Scaling>Identity</Scaling>
            <ScanLineOrdering>Progressive</ScanLineOrdering>
          </PathTarget>
        </Targets>
      </Path>
    </Paths>
  </Profile>
  <Profile>
    <Name>NvFour</Name>
    <Paths>
      <Path>
        <PixelFormat>PixelFormat32Bpp</PixelFormat>
        <Position>
          <X>0</X>
          <Y>0</Y>
        </Position>
        <Resolution>
          <Width>7680</Width>
          <Height>1440</Height>
        </Resolution>
        <SourceId>0</SourceId>
        <Targets>
          <PathTarget>
            <DevicePath>\\?\DISPLAY#ACI27EC#5&amp;2e126b7&amp;5&amp;UID5120</DevicePath>
            <DisplayName>NV Surround</DisplayName>
            <FrequencyInMillihertz>165000</FrequencyInMillihertz>
            <Rotation>Identity</Rotation>
            <Scaling>Identity</Scaling>
            <ScanLineOrdering>Progressive</ScanLineOrdering>
            <SurroundTopology>
              <AcceleratePrimaryDisplay>true</AcceleratePrimaryDisplay>
              <ApplyWithBezelCorrectedResolution>true</ApplyWithBezelCorrectedResolution>
              <BaseMosaicPanoramic>false</BaseMosaicPanoramic>
              <ColorDepth>32</ColorDepth>
              <Columns>3</Columns>
              <Displays>
                <SurroundTopologyDisplay>
                  <DisplayId>2147881095</DisplayId>
                  <DisplayName>ROG PG279Q</DisplayName>
                  <Overlap>
                    <X>0</X>
                    <Y>0</Y>
                  </Overlap>
                  <PixelShiftType>NoPixelShift</PixelShiftType>
                  <Rotation>Identity</Rotation>
                </SurroundTopologyDisplay>
                <SurroundTopologyDisplay>
                  <DisplayId>2147881093</DisplayId>
                  <DisplayName>ROG PG279Q</DisplayName>
                  <Overlap>
                    <X>-90</X>
                    <Y>0</Y>
                  </Overlap>
                  <PixelShiftType>NoPixelShift</PixelShiftType>
                  <Rotation>Identity</Rotation>
                </SurroundTopologyDisplay>
                <SurroundTopologyDisplay>
                  <DisplayId>2147881089</DisplayId>
                  <DisplayName>ROG PG279Q</DisplayName>
                  <Overlap>
                    <X>-90</X>
                    <Y>0</Y>
                  </Overlap>
                  <PixelShiftType>NoPixelShift</PixelShiftType>
                  <Rotation>Identity</Rotation>
                </SurroundTopologyDisplay>
              </Displays>
              <DriverReloadAllowed>false</DriverReloadAllowed>
              <Frequency>165</Frequency>
              <ImmersiveGaming>true</ImmersiveGaming>
              <Resolution>
                <Width>2560</Width>
                <Height>1440</Height>
              </Resolution>
              <Rows>1</Rows>
            </SurroundTopology>
          </PathTarget>
        </Targets>
      </Path>
      <Path>
        <PixelFormat>PixelFormat32Bpp</PixelFormat>
        <Position>
          <X>7680</X>
          <Y>196</Y>
        </Position>
        <Resolution>
          <Width>1920</Width>
          <Height>1080</Height>
        </Resolution>
        <SourceId>1</SourceId>
        <Targets>
          <PathTarget>
            <DevicePath>\\?\DISPLAY#GSM0001#5&amp;2e126b7&amp;5&amp;UID4353</DevicePath>
            <DisplayName>32LV2400</DisplayName>
            <FrequencyInMillihertz>60000</FrequencyInMillihertz>
            <Rotation>Identity</Rotation>
            <Scaling>Identity</Scaling>
            <ScanLineOrdering>Progressive</ScanLineOrdering>
          </PathTarget>
        </Targets>
      </Path>
    </Paths>
  </Profile>
</ArrayOfProfile>
falahati commented 6 years ago

Hey,

It would be great if some of you guys could create a copy from their correct "DisplayProfile_1.0.xml" file (if you made one manually), delete it and try the program again with invalid profiles. Then follow these steps:

  1. Download the HeliosDisplayManagement.Reporting.zip file.
  2. Extract it to the desktop. (or somewhere with write access for your user account)
  3. Execute the program and wait for it to end, then press Enter to exit.
  4. This will generate a log file right next to the program, rename this newly created log file from "HeliosDisplayManagement.Reporting.XXXXX.log" to a meaningful name, for example: "DisabledSurround.log" or "AllMonitorsExtended.log" so I know what the log is about.
  5. Switch to other modes (using Windows Control Panel and NVidia Control Panel) and repeat these steps.

At the end of this process, you should have multiple ".log" files each generated while your system was in a correct mode. I need this information as I need to follow the program's logic based on your system while you are in a specific mode. Send these log files to me. Feel free to check the log files for any information you might not want to share with the public.

Also, the source code of this program is now available as a part of this repository, so you can always check the source code or even compile it yourself.

skylerskinner commented 6 years ago

Love the project, switching to my default triple separate screen setup works great, but I'm also having the same issue and can't switch to my surround profile. I made the profile in surround and couldn't switch back to it, that profile is exactly the same as what I've attacked but without the displaytopology field, I just copy/pasted that in 3 different times from 3 different users that posted their working solutions and changed all appropriate fields to the correct display ID's, and names. All the information I had to change is accurate. It did actually change one time after I fiddled around with it a ton and I have no clue what it was that I changed, and no matter how I messed with it my screens were locked at 50hz for some reason, since then it just hasn't worked. After making the profile from the in-app interface and making all those changes it simply does the 30 second countdown and doesn't change anything, with the exception of that one time it almost worked.

I'd love to see this working properly, if you get it figured out please release a new build with an installer. :)

I've included my profile, the reporter logs for both screen modes, and the WindowsDisplayAPISample output for both screen modes. My Nvidia Control Panel version is 8.1.940.0 I'm running Windows 10 ver 1803

HeliosReporting - Triple Separate Monitors.log

HeliosReporting - Triple Screen Surround.log

WindowsDisplayOUTPUT - Triple Separate Monitors.txt

WindowsDisplayOUTPUT - Triple Screen Surround.txt

DisplayProfiles_1.0.txt

amasover commented 6 years ago

Sorry for the delay, here are my logs:

logs.zip

Let me know if there's any other configurations you'd like me to try, or if I can help in any other way.

falahati commented 6 years ago

Thanks,

Unfortunately, with my setup, NVidia control panel works quite different comparing to the results I see in your log files. Therefore I can't really debug the problem and I have to simulate the code with the log files you provided.

However, I tried one more time to fix this problem and released a new version, please try it out and report back about how it went. https://github.com/falahati/HeliosDisplayManagement/releases/tag/v0.9.3

I strongly recommend rebooting your system after upgrading your installation, unless it is your first time installing this app

Thanks

skylerskinner commented 6 years ago

I upgraded to 0.9.3 and am still having the same issue I talked about above. Even rebooted twice after upgrading. I can't switch into surround, it just ticks down the 30 second timer and does nothing at all. Just letting you know.

Also, would be really cool if you could include an uninstaller

falahati commented 6 years ago

Please try this version: https://github.com/falahati/HeliosDisplayManagement/releases/tag/v0.9.3.4

amasover commented 6 years ago

Looks like this is very close to working in v0.9.3.4.

Compare the generated json with my hand-edited working version.

It seems Helios is grabbing the wrong monitor to add to the surround topology. In the generated json, Helios adds a single monitor (my Acer XB270HU) to the surround topology. My intended surround configuration instead has three Dell U2414H monitors.

Single monitor in the topology is probably also why ApplyWithBezelCorrectedResolution and ImmersiveGaming are incorrectly toggled off.

falahati commented 6 years ago

ImmersiveGaming is for Quadro boards only. You shouldn't enable it from there. ApplyWithBezelCorrectedResolution is also irrelevant because Helios going to change resolution later again. To enable bezel correction, you should change the resolution on the parent path.

I take another look at this. Thanks for helping fix this problem.

falahati commented 6 years ago

Please try this one: https://github.com/falahati/HeliosDisplayManagement/releases/tag/v0.9.4.4

Hope this works.

amasover commented 6 years ago

ImmersiveGaming is for Quadro boards only. You shouldn't enable it from there. ApplyWithBezelCorrectedResolution is also irrelevant

Good to know. I ended up enabling both of those while fiddling with things in my manual setup, so I just assumed they were necessary to get surround working.

I tried v0.9.4.4, and it seems to generate a correct DisplayProfiles_2.0.json for my setup! I tested deleting my existing .json file and re-creating it from scratch in the UI (switching via NVidia Control Panel / Windows Display Settings, and then cloning each configuration in Helios). I can switch to/from my (generated) surround profile without needing to manually edit the config file.

Thanks again for your work on this @falahati. It definitely beats the laborious process of opening NVidia control panel -> configure surround -> close 50 apps -> set up bezel correction -> hit okay -> wait for surround to enable -> manually enable additional non-surround monitors.

falahati commented 6 years ago

Thanks for reporting back, I going to close this issue, please feel free to create a new issue if anyone else had a similar problem.