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