using System; using System.Linq; using System.Runtime.InteropServices; using NvAPIWrapper.Native.Attributes; using NvAPIWrapper.Native.General.Structures; using NvAPIWrapper.Native.Helpers; using NvAPIWrapper.Native.Interfaces; namespace NvAPIWrapper.Native.GPU.Structures { /// /// Contains information regarding the GPU clock boost locks /// [StructLayout(LayoutKind.Sequential, Pack = 8)] [StructureVersion(2)] public struct PrivateClockBoostLockV2 : IInitializable { internal const int MaxNumberOfClocksPerGPU = ClockFrequenciesV1.MaxClocksPerGPU; internal StructureVersion _Version; internal uint _Unknown; internal uint _ClockBoostLocksCount; [MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxNumberOfClocksPerGPU)] internal ClockBoostLock[] _ClockBoostLocks; /// /// Gets the list of clock boost locks /// public ClockBoostLock[] ClockBoostLocks { get => _ClockBoostLocks.Take((int) _ClockBoostLocksCount).ToArray(); } /// /// Creates a new instance of /// /// The list of clock boost locks public PrivateClockBoostLockV2(ClockBoostLock[] clockBoostLocks) { if (clockBoostLocks?.Length > MaxNumberOfClocksPerGPU) { throw new ArgumentException($"Maximum of {MaxNumberOfClocksPerGPU} clocks are configurable.", nameof(clockBoostLocks)); } if (clockBoostLocks == null || clockBoostLocks.Length == 0) { throw new ArgumentException("Array is null or empty.", nameof(clockBoostLocks)); } this = typeof(PrivateClockBoostLockV2).Instantiate(); _ClockBoostLocksCount = (uint) clockBoostLocks.Length; Array.Copy(clockBoostLocks, 0, _ClockBoostLocks, 0, clockBoostLocks.Length); } /// /// Contains information regarding a clock boost lock /// [StructLayout(LayoutKind.Sequential, Pack = 8)] public struct ClockBoostLock { internal PublicClockDomain _ClockDomain; internal uint _Unknown1; internal ClockLockMode _LockMode; internal uint _Unknown2; internal uint _VoltageInMicroV; internal uint _Unknown3; /// /// Gets the public clock domain /// public PublicClockDomain ClockDomain { get => _ClockDomain; } /// /// Gets the clock lock mode /// public ClockLockMode LockMode { get => _LockMode; } /// /// Gets the locked voltage in uV /// public uint VoltageInMicroV { get => _VoltageInMicroV; } /// /// Creates a new instance of . /// /// The public clock domain. /// The clock lock mode. /// The locked voltage in uV. public ClockBoostLock(PublicClockDomain clockDomain, ClockLockMode lockMode, uint voltageInMicroV) : this() { _ClockDomain = clockDomain; _LockMode = lockMode; _VoltageInMicroV = voltageInMicroV; } } } }