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();
})
);
}
}
}