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.Helpers; using NvAPIWrapper.Native.Interfaces; using NvAPIWrapper.Native.Interfaces.GPU; namespace NvAPIWrapper.Native.GPU.Structures { /// /// Holds information about the dynamic performance states (such as GPU utilization domain) /// [StructLayout(LayoutKind.Sequential, Pack = 8)] [StructureVersion(1)] public struct DynamicPerformanceStatesInfoV1 : IInitializable, IUtilizationStatus { internal const int MaxGpuUtilizations = 8; internal StructureVersion _Version; internal readonly uint _Flags; [MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxGpuUtilizations)] internal UtilizationDomainInfo[] _UtilizationDomain; /// /// Gets a boolean value indicating if the dynamic performance state is enabled /// public bool IsDynamicPerformanceStatesEnabled { get => _Flags.GetBit(0); } /// public Dictionary Domains { get => _UtilizationDomain .Select((value, index) => new {index, value}) .Where(arg => Enum.IsDefined(typeof(UtilizationDomain), arg.index) && arg.value.IsPresent) .ToDictionary(arg => (UtilizationDomain) arg.index, arg => arg.value as IUtilizationDomainInfo); } /// public IUtilizationDomainInfo GPU { get => _UtilizationDomain[(int) UtilizationDomain.GPU]; } /// public IUtilizationDomainInfo FrameBuffer { get => _UtilizationDomain[(int) UtilizationDomain.FrameBuffer]; } /// public IUtilizationDomainInfo VideoEngine { get => _UtilizationDomain[(int) UtilizationDomain.VideoEngine]; } /// public IUtilizationDomainInfo BusInterface { get => _UtilizationDomain[(int) UtilizationDomain.BusInterface]; } /// public override string ToString() { return $"GPU = {GPU} - " + $"FrameBuffer = {FrameBuffer} - " + $"VideoEngine = {VideoEngine} - " + $"BusInterface = {BusInterface}"; } /// /// Holds information about a dynamic performance state utilization domain /// [StructLayout(LayoutKind.Sequential)] public struct UtilizationDomainInfo : IUtilizationDomainInfo { internal readonly uint _IsPresent; internal readonly uint _Percentage; /// public bool IsPresent { get => _IsPresent.GetBit(0); } /// public uint Percentage { get => _Percentage; } /// public override string ToString() { return IsPresent ? $"{Percentage}%" : "N/A"; } } } }