Hardware/ATI/ATIGroup.cs
author moel.mich
Sat, 25 Jun 2011 14:46:28 +0000
changeset 304 16a86362c2ca
parent 247 6dc755f1970e
child 333 c34cbcc7df66
permissions -rw-r--r--
Changed the maximum buffer size for double buffering of controls that isn't disposed after each draw call to the size of the screen. This should reduce the memory allocation and disposing on each sensor update. Also page faults are no longer increasing with this change.
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;
moel@1
    39
using System.Collections.Generic;
moel@166
    40
using System.Globalization;
moel@1
    41
using System.Text;
moel@1
    42
moel@1
    43
namespace OpenHardwareMonitor.Hardware.ATI {
moel@165
    44
  internal class ATIGroup : IGroup {
moel@1
    45
moel@195
    46
    private readonly List<ATIGPU> hardware = new List<ATIGPU>();
moel@195
    47
    private readonly StringBuilder report = new StringBuilder();
moel@1
    48
moel@165
    49
    public ATIGroup(ISettings settings) {
moel@1
    50
      try {
moel@6
    51
        int status = ADL.ADL_Main_Control_Create(1);
moel@6
    52
moel@6
    53
        report.AppendLine("AMD Display Library");
moel@6
    54
        report.AppendLine();
moel@6
    55
        report.Append("Status: ");
moel@195
    56
        report.AppendLine(status == ADL.ADL_OK ? "OK" : 
moel@195
    57
          status.ToString(CultureInfo.InvariantCulture));
moel@6
    58
        report.AppendLine();
moel@6
    59
moel@6
    60
        if (status == ADL.ADL_OK) {
moel@1
    61
          int numberOfAdapters = 0;
moel@1
    62
          ADL.ADL_Adapter_NumberOfAdapters_Get(ref numberOfAdapters);
moel@6
    63
          
moel@35
    64
          report.Append("Number of adapters: "); 
moel@166
    65
          report.AppendLine(numberOfAdapters.ToString(CultureInfo.InvariantCulture));
moel@1
    66
          report.AppendLine();
moel@1
    67
moel@1
    68
          if (numberOfAdapters > 0) {
moel@1
    69
            ADLAdapterInfo[] adapterInfo = new ADLAdapterInfo[numberOfAdapters];
moel@6
    70
            if (ADL.ADL_Adapter_AdapterInfo_Get(adapterInfo) == ADL.ADL_OK)
moel@1
    71
              for (int i = 0; i < numberOfAdapters; i++) {
moel@1
    72
                int isActive;
moel@1
    73
                ADL.ADL_Adapter_Active_Get(adapterInfo[i].AdapterIndex,
moel@1
    74
                  out isActive);
moel@29
    75
                int adapterID;
moel@29
    76
                ADL.ADL_Adapter_ID_Get(adapterInfo[i].AdapterIndex,
moel@29
    77
                  out adapterID);
moel@1
    78
moel@1
    79
                report.Append("AdapterIndex: "); 
moel@166
    80
                report.AppendLine(i.ToString(CultureInfo.InvariantCulture));
moel@1
    81
                report.Append("isActive: "); 
moel@166
    82
                report.AppendLine(isActive.ToString(CultureInfo.InvariantCulture));
moel@1
    83
                report.Append("AdapterName: "); 
moel@1
    84
                report.AppendLine(adapterInfo[i].AdapterName);     
moel@1
    85
                report.Append("UDID: ");
moel@1
    86
                report.AppendLine(adapterInfo[i].UDID);
moel@3
    87
                report.Append("Present: ");
moel@166
    88
                report.AppendLine(adapterInfo[i].Present.ToString(
moel@166
    89
                  CultureInfo.InvariantCulture));
moel@3
    90
                report.Append("VendorID: ");
moel@166
    91
                report.AppendLine(adapterInfo[i].VendorID.ToString(
moel@166
    92
                  CultureInfo.InvariantCulture));
moel@3
    93
                report.Append("BusNumber: ");
moel@166
    94
                report.AppendLine(adapterInfo[i].BusNumber.ToString(
moel@166
    95
                  CultureInfo.InvariantCulture));
moel@3
    96
                report.Append("DeviceNumber: ");
moel@166
    97
                report.AppendLine(adapterInfo[i].DeviceNumber.ToString(
moel@166
    98
                 CultureInfo.InvariantCulture));
moel@3
    99
                report.Append("FunctionNumber: ");
moel@166
   100
                report.AppendLine(adapterInfo[i].FunctionNumber.ToString(
moel@166
   101
                  CultureInfo.InvariantCulture));
moel@29
   102
                report.Append("AdapterID: 0x");
moel@270
   103
                report.AppendLine(adapterID.ToString("X", 
moel@270
   104
                  CultureInfo.InvariantCulture));
moel@1
   105
moel@270
   106
                if (!string.IsNullOrEmpty(adapterInfo[i].UDID) &&
moel@29
   107
                  (adapterInfo[i].VendorID == ADL.ATI_VENDOR_ID1 ||
moel@29
   108
                   adapterInfo[i].VendorID == ADL.ATI_VENDOR_ID2)) {
moel@29
   109
                  bool found = false;
moel@29
   110
                  foreach (ATIGPU gpu in hardware)
moel@29
   111
                    if (gpu.BusNumber == adapterInfo[i].BusNumber &&
moel@29
   112
                      gpu.DeviceNumber == adapterInfo[i].DeviceNumber) {
moel@29
   113
                      found = true;
moel@29
   114
                      break;
moel@29
   115
                    }
moel@29
   116
                  if (!found)
moel@29
   117
                    hardware.Add(new ATIGPU(
moel@29
   118
                      adapterInfo[i].AdapterName.Trim(),
moel@29
   119
                      adapterInfo[i].AdapterIndex,
moel@29
   120
                      adapterInfo[i].BusNumber,
moel@165
   121
                      adapterInfo[i].DeviceNumber, settings));
moel@1
   122
                }
moel@11
   123
moel@11
   124
                report.AppendLine();
moel@1
   125
              }
moel@1
   126
          }
moel@1
   127
        }
moel@11
   128
      } catch (DllNotFoundException) { } 
moel@11
   129
        catch (EntryPointNotFoundException e) {
moel@11
   130
          report.AppendLine();
moel@11
   131
          report.AppendLine(e.ToString());
moel@11
   132
          report.AppendLine();        
moel@11
   133
        }
moel@1
   134
    }
moel@1
   135
moel@1
   136
    public IHardware[] Hardware {
moel@1
   137
      get {
moel@1
   138
        return hardware.ToArray();
moel@1
   139
      }
moel@1
   140
    }
moel@1
   141
moel@1
   142
    public string GetReport() {
moel@1
   143
      return report.ToString();
moel@1
   144
    }
moel@1
   145
moel@1
   146
    public void Close() {
moel@1
   147
      try {
moel@247
   148
        foreach (ATIGPU gpu in hardware)
moel@247
   149
          gpu.Close();
moel@1
   150
        ADL.ADL_Main_Control_Destroy();
moel@1
   151
      } catch (Exception) { }
moel@1
   152
    }
moel@1
   153
  }
moel@1
   154
}