using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using NvAPIWrapper.Native.Attributes;
using NvAPIWrapper.Native.General.Structures;
using NvAPIWrapper.Native.Helpers;
using NvAPIWrapper.Native.Interfaces;
using NvAPIWrapper.Native.Interfaces.GPU;
namespace NvAPIWrapper.Native.GPU.Structures
{
///
[StructLayout(LayoutKind.Sequential, Pack = 8)]
[StructureVersion(2)]
public struct PerformanceStatesInfoV2 : IInitializable, IPerformanceStatesInfo
{
internal const int MaxPerformanceStates = PerformanceStatesInfoV1.MaxPerformanceStates;
internal const int MaxPerformanceStateClocks = PerformanceStatesInfoV1.MaxPerformanceStateClocks;
internal const int MaxPerformanceStateVoltages = 16;
internal StructureVersion _Version;
internal uint _Flags;
internal uint _NumberOfPerformanceStates;
internal uint _NumberOfClocks;
internal uint _NumberOfVoltages;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxPerformanceStates)]
internal PerformanceState[] _PerformanceStates;
///
public bool IsPerformanceMonitorEnable
{
get => _Flags.GetBit(0);
}
///
public bool IsCapableOfDynamicPerformance
{
get => _Flags.GetBit(1);
}
///
public bool IsDynamicPerformanceEnable
{
get => _Flags.GetBit(2);
}
///
/// Gets an array of valid and available performance states information
///
public PerformanceState[] PerformanceStates
{
get => _PerformanceStates.Take((int) _NumberOfPerformanceStates).ToArray();
}
///
IPerformanceState[] IPerformanceStatesInfo.PerformanceStates
{
get => PerformanceStates.Cast().ToArray();
}
///
/// Gets a dictionary of valid and available performance states and their voltage information as an array
///
public IReadOnlyDictionary
PerformanceStatesVoltages
{
get
{
var voltages = (int) _NumberOfVoltages;
return PerformanceStates.ToDictionary(
state => state.StateId,
state => state._Voltages.Take(voltages).ToArray()
);
}
}
///
IReadOnlyDictionary IPerformanceStatesInfo.
PerformanceStatesVoltages
{
get
{
return PerformanceStatesVoltages.ToDictionary(
pair => pair.Key,
pair => pair.Value.Cast().ToArray()
);
}
}
///
/// Gets a dictionary of valid and available performance states and their clock information as an array
///
public IReadOnlyDictionary
PerformanceStatesClocks
{
get
{
var clocks = (int) _NumberOfClocks;
return PerformanceStates.ToDictionary(
state => state.StateId,
state => state._Clocks.Take(clocks).ToArray()
);
}
}
///
IReadOnlyDictionary IPerformanceStatesInfo.
PerformanceStatesClocks
{
get
{
return PerformanceStatesClocks.ToDictionary(
pair => pair.Key,
pair => pair.Value.Cast().ToArray()
);
}
}
///
[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct PerformanceState : IInitializable, IPerformanceState
{
internal PerformanceStateId _Id;
internal uint _Flags;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxPerformanceStateClocks)]
internal PerformanceStatesClock[] _Clocks;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxPerformanceStateVoltages)]
internal PerformanceStatesVoltage[] _Voltages;
///
public PerformanceStateId StateId
{
get => _Id;
}
///
public bool IsPCIELimited
{
get => _Flags.GetBit(0);
}
///
public bool IsOverclocked
{
get => _Flags.GetBit(1);
}
///
public bool IsOverclockable
{
get => _Flags.GetBit(2);
}
///
[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct PerformanceStatesVoltage : IInitializable, IPerformanceStatesVoltage
{
internal PerformanceVoltageDomain _Id;
internal uint _Flags;
internal uint _Value;
///
public PerformanceVoltageDomain DomainId
{
get => _Id;
}
///
public uint Value
{
get => _Value;
}
}
///
[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct PerformanceStatesClock : IInitializable, IPerformanceStatesClock
{
internal PublicClockDomain _Id;
internal uint _Flags;
internal uint _Frequency;
///
/// Gets a boolean value indicating if this clock domain is overclockable
///
public bool IsOverclockable
{
get => _Flags.GetBit(0);
}
///
public PublicClockDomain DomainId
{
get => _Id;
}
///
public uint Frequency
{
get => _Frequency;
}
}
}
}
}