using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using NvAPIWrapper.Native.Attributes; using NvAPIWrapper.Native.General.Structures; using NvAPIWrapper.Native.Interfaces; using NvAPIWrapper.Native.Interfaces.GPU; namespace NvAPIWrapper.Native.GPU.Structures { /// /// Holds clock frequencies currently associated with a physical GPU /// [StructLayout(LayoutKind.Sequential, Pack = 8)] [StructureVersion(1)] public struct ClockFrequenciesV1 : IInitializable, IClockFrequencies { internal const int MaxClocksPerGPU = 32; internal StructureVersion _Version; internal readonly uint _Reserved; [MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxClocksPerGPU)] internal ClockDomainInfo[] _Clocks; /// public IReadOnlyDictionary Clocks { get => _Clocks .Select((value, index) => new {index, value}) .Where(arg => Enum.IsDefined(typeof(PublicClockDomain), arg.index)) .ToDictionary(arg => (PublicClockDomain) arg.index, arg => arg.value); } /// public ClockType ClockType { get => ClockType.CurrentClock; } /// public ClockDomainInfo GraphicsClock { get => _Clocks[(int) PublicClockDomain.Graphics]; } /// public ClockDomainInfo MemoryClock { get => _Clocks[(int) PublicClockDomain.Memory]; } /// public ClockDomainInfo VideoDecodingClock { get => _Clocks[(int) PublicClockDomain.Video]; } /// public ClockDomainInfo ProcessorClock { get => _Clocks[(int) PublicClockDomain.Processor]; } /// public override string ToString() { return $"[{ClockType}] 3D Graphics = {GraphicsClock} - Memory = {MemoryClock} - Video Decoding = {VideoDecodingClock} - Processor = {ProcessorClock}"; } } }