using System.Collections.Generic; using System.Linq; using NvAPIWrapper.Native.GPU; using NvAPIWrapper.Native.GPU.Structures; using NvAPIWrapper.Native.Interfaces.GPU; namespace NvAPIWrapper.GPU { /// /// Holds the retrieved performance states information /// public class GPUPerformanceStatesInformation { internal GPUPerformanceStatesInformation( IPerformanceStates20Info states20Info, PerformanceStateId currentPerformanceStateId, PrivatePCIeInfoV2? pciInformation) { IsReadOnly = !states20Info.IsEditable; GlobalVoltages = states20Info.GeneralVoltages .Select(entry => new GPUPerformanceStateVoltage(entry)) .ToArray(); var clocks = states20Info.Clocks; var baseVoltages = states20Info.Voltages; PerformanceStates = states20Info.PerformanceStates.Select((state20, i) => { PCIeInformation statePCIeInfo = null; if (pciInformation != null && pciInformation.Value.PCIePerformanceStateInfos.Length > i) { statePCIeInfo = new PCIeInformation(pciInformation.Value.PCIePerformanceStateInfos[i]); } return new GPUPerformanceState( i, state20, clocks[state20.StateId], baseVoltages[state20.StateId], statePCIeInfo ); }).ToArray(); CurrentPerformanceState = PerformanceStates.FirstOrDefault(performanceState => performanceState.StateId == currentPerformanceStateId); } /// /// Gets the currently active performance state /// public GPUPerformanceState CurrentPerformanceState { get; } /// /// Gets a list of global voltage settings /// public GPUPerformanceStateVoltage[] GlobalVoltages { get; } /// /// Gets a boolean value indicating if performance states are readonly /// public bool IsReadOnly { get; } /// /// Gets a list of all available performance states /// public GPUPerformanceState[] PerformanceStates { get; } /// public override string ToString() { if (PerformanceStates.Length == 0) { return "No Performance State Available"; } return string.Join( ", ", PerformanceStates .Select( state => { var attributes = new List(); if (state.IsReadOnly) { attributes.Add("ReadOnly"); } if (CurrentPerformanceState.StateId == state.StateId) { attributes.Add("Active"); } if (attributes.Any()) { return $"{state.StateId} ({string.Join(" - ", attributes)})"; } return state.StateId.ToString(); }) ); } } }