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