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