Hardware/Nvidia/NvidiaGroup.cs
author moel.mich
Thu, 11 Nov 2010 21:22:24 +0000
changeset 241 52007c404f32
parent 182 4801e9eaf979
child 298 96263190189a
permissions -rw-r--r--
Fixed a problem, where the MainForm location and size was lost when the application is started minimized and exited without ever showing the form. This caused MainForm_Load to be never called (location and size was not loaded), but the default size and location were still saved. The new implementation only saves the location and size when one of the two is changed.
moel@1
     1
/*
moel@1
     2
  
moel@1
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@1
     4
moel@1
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@1
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@1
     7
  the License. You may obtain a copy of the License at
moel@1
     8
 
moel@1
     9
  http://www.mozilla.org/MPL/
moel@1
    10
moel@1
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@1
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@1
    13
  for the specific language governing rights and limitations under the License.
moel@1
    14
moel@1
    15
  The Original Code is the Open Hardware Monitor code.
moel@1
    16
moel@1
    17
  The Initial Developer of the Original Code is 
moel@1
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@1
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2010
moel@1
    20
  the Initial Developer. All Rights Reserved.
moel@1
    21
moel@1
    22
  Contributor(s):
moel@1
    23
moel@1
    24
  Alternatively, the contents of this file may be used under the terms of
moel@1
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@1
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@1
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@1
    28
  of those above. If you wish to allow use of your version of this file only
moel@1
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@1
    30
  use your version of this file under the terms of the MPL, indicate your
moel@1
    31
  decision by deleting the provisions above and replace them with the notice
moel@1
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@1
    33
  the provisions above, a recipient may use your version of this file under
moel@1
    34
  the terms of any one of the MPL, the GPL or the LGPL.
moel@1
    35
 
moel@1
    36
*/
moel@1
    37
moel@1
    38
using System.Collections.Generic;
moel@166
    39
using System.Globalization;
moel@35
    40
using System.Text;
moel@1
    41
moel@1
    42
namespace OpenHardwareMonitor.Hardware.Nvidia {
moel@1
    43
moel@165
    44
  internal class NvidiaGroup : IGroup {
moel@35
    45
   
moel@195
    46
    private readonly List<IHardware> hardware = new List<IHardware>();
moel@195
    47
    private readonly StringBuilder report = new StringBuilder();
moel@1
    48
moel@165
    49
    public NvidiaGroup(ISettings settings) {
moel@1
    50
      if (!NVAPI.IsAvailable)
moel@1
    51
        return;
moel@1
    52
moel@35
    53
      report.AppendLine("NVAPI");
moel@35
    54
      report.AppendLine();
moel@35
    55
moel@140
    56
      string version;
moel@140
    57
      if (NVAPI.NvAPI_GetInterfaceVersionString(out version) == NvStatus.OK) {
moel@140
    58
        report.Append("Version: ");
moel@140
    59
        report.AppendLine(version);
moel@140
    60
      }
moel@140
    61
moel@1
    62
      NvPhysicalGpuHandle[] handles = 
moel@1
    63
        new NvPhysicalGpuHandle[NVAPI.MAX_PHYSICAL_GPUS];
moel@140
    64
      int count;
moel@115
    65
      if (NVAPI.NvAPI_EnumPhysicalGPUs == null) {
moel@115
    66
        report.AppendLine("Error: NvAPI_EnumPhysicalGPUs not available");
moel@115
    67
        report.AppendLine();
moel@115
    68
        return;
moel@140
    69
      } else {        
moel@140
    70
        NvStatus status = NVAPI.NvAPI_EnumPhysicalGPUs(handles, out count);
moel@140
    71
        if (status != NvStatus.OK) {
moel@195
    72
          report.AppendLine("Status: " + status);
moel@140
    73
          report.AppendLine();
moel@140
    74
          return;
moel@140
    75
        }
moel@115
    76
      }
moel@115
    77
moel@140
    78
      IDictionary<NvPhysicalGpuHandle, NvDisplayHandle> displayHandles =
moel@140
    79
        new Dictionary<NvPhysicalGpuHandle, NvDisplayHandle>();
moel@140
    80
moel@140
    81
      if (NVAPI.NvAPI_EnumNvidiaDisplayHandle != null &&
moel@140
    82
        NVAPI.NvAPI_GetPhysicalGPUsFromDisplay != null) 
moel@140
    83
      {
moel@140
    84
        NvStatus status = NvStatus.OK;
moel@140
    85
        int i = 0;
moel@140
    86
        while (status == NvStatus.OK) {
moel@140
    87
          NvDisplayHandle displayHandle = new NvDisplayHandle();
moel@140
    88
          status = NVAPI.NvAPI_EnumNvidiaDisplayHandle(i, ref displayHandle);
moel@140
    89
          i++;
moel@140
    90
moel@140
    91
          if (status == NvStatus.OK) {
moel@140
    92
            NvPhysicalGpuHandle[] handlesFromDisplay =
moel@140
    93
              new NvPhysicalGpuHandle[NVAPI.MAX_PHYSICAL_GPUS];
moel@140
    94
            uint countFromDisplay;
moel@140
    95
            if (NVAPI.NvAPI_GetPhysicalGPUsFromDisplay(displayHandle,
moel@140
    96
              handlesFromDisplay, out countFromDisplay) == NvStatus.OK) {
moel@140
    97
              for (int j = 0; j < countFromDisplay; j++) {
moel@140
    98
                if (!displayHandles.ContainsKey(handlesFromDisplay[j]))
moel@140
    99
                  displayHandles.Add(handlesFromDisplay[j], displayHandle);
moel@140
   100
              }
moel@140
   101
            }
moel@140
   102
          }
moel@140
   103
        }
moel@140
   104
      }
moel@1
   105
moel@35
   106
      report.Append("Number of GPUs: ");
moel@195
   107
      report.AppendLine(count.ToString(CultureInfo.InvariantCulture));
moel@195
   108
moel@195
   109
      for (int i = 0; i < count; i++) {
moel@140
   110
        NvDisplayHandle displayHandle;
moel@195
   111
        displayHandles.TryGetValue(handles[i], out displayHandle);
moel@195
   112
        hardware.Add(new NvidiaGPU(i, handles[i], displayHandle, settings));
moel@140
   113
      }
moel@140
   114
moel@35
   115
      report.AppendLine();
moel@1
   116
    }
moel@1
   117
moel@1
   118
    public IHardware[] Hardware {
moel@1
   119
      get {
moel@1
   120
        return hardware.ToArray();
moel@1
   121
      }
moel@1
   122
    }
moel@1
   123
moel@1
   124
    public string GetReport() {
moel@35
   125
      return report.ToString();
moel@1
   126
    }
moel@1
   127
moel@140
   128
    public void Close() { }
moel@1
   129
  }
moel@1
   130
}