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 information about the GPU usage statistics /// [StructLayout(LayoutKind.Sequential, Pack = 8)] [StructureVersion(1)] public struct PrivateUsagesInfoV1 : IInitializable, IUtilizationStatus { internal const int MaxNumberOfUsageEntries = DynamicPerformanceStatesInfoV1.MaxGpuUtilizations; internal StructureVersion _Version; internal uint _Unknown; [MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxNumberOfUsageEntries, ArraySubType = UnmanagedType.Struct)] internal UsagesInfoEntry[] _UsagesInfoEntries; /// public Dictionary Domains { get => _UsagesInfoEntries .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 => _UsagesInfoEntries[(int) UtilizationDomain.GPU]; } /// public IUtilizationDomainInfo FrameBuffer { get => _UsagesInfoEntries[(int) UtilizationDomain.FrameBuffer]; } /// public IUtilizationDomainInfo VideoEngine { get => _UsagesInfoEntries[(int) UtilizationDomain.VideoEngine]; } /// public IUtilizationDomainInfo BusInterface { get => _UsagesInfoEntries[(int) UtilizationDomain.BusInterface]; } /// public override string ToString() { return $"GPU = {GPU} - " + $"FrameBuffer = {FrameBuffer} - " + $"VideoEngine = {VideoEngine} - " + $"BusInterface = {BusInterface}"; } /// /// Holds information about the usage statistics for a domain /// [StructLayout(LayoutKind.Sequential, Pack = 8)] public struct UsagesInfoEntry : IUtilizationDomainInfo { internal uint _IsPresent; internal uint _Percentage; internal uint _Unknown1; internal uint _Unknown2; /// public bool IsPresent { get => _IsPresent > 0; } /// public uint Percentage { get => _Percentage; } /// public override string ToString() { return IsPresent ? $"{Percentage}%" : "N/A"; } } } }