using System.Collections.Generic;
using System.Linq;
using NvAPIWrapper.Native;
using NvAPIWrapper.Native.GPU;
namespace NvAPIWrapper.GPU
{
///
/// Holds information about the GPU utilization domains
///
public class GPUUsageInformation
{
internal GPUUsageInformation(PhysicalGPU physicalGPU)
{
PhysicalGPU = physicalGPU;
}
///
/// Gets the Bus interface (BUS) utilization
///
public GPUUsageDomainStatus BusInterface
{
get => UtilizationDomainsStatus.FirstOrDefault(status => status.Domain == UtilizationDomain.BusInterface);
}
///
/// Gets the frame buffer (FB) utilization
///
public GPUUsageDomainStatus FrameBuffer
{
get => UtilizationDomainsStatus.FirstOrDefault(status => status.Domain == UtilizationDomain.FrameBuffer);
}
///
/// Gets the graphic engine (GPU) utilization
///
public GPUUsageDomainStatus GPU
{
get => UtilizationDomainsStatus.FirstOrDefault(status => status.Domain == UtilizationDomain.GPU);
}
///
/// Gets a boolean value indicating if the dynamic performance states is enabled
///
public bool IsDynamicPerformanceStatesEnabled
{
get => GPUApi.GetDynamicPerformanceStatesInfoEx(PhysicalGPU.Handle).IsDynamicPerformanceStatesEnabled;
}
///
/// Gets the physical GPU that this instance describes
///
public PhysicalGPU PhysicalGPU { get; }
///
/// Gets all valid utilization domains and information
///
public IEnumerable UtilizationDomainsStatus
{
get
{
try
{
var dynamicPerformanceStates = GPUApi.GetDynamicPerformanceStatesInfoEx(PhysicalGPU.Handle);
if (dynamicPerformanceStates.IsDynamicPerformanceStatesEnabled)
{
return dynamicPerformanceStates.Domains
.Select(pair => new GPUUsageDomainStatus(pair.Key, pair.Value));
}
}
catch
{
// ignored
}
return GPUApi.GetUsages(PhysicalGPU.Handle).Domains
.Select(pair => new GPUUsageDomainStatus(pair.Key, pair.Value));
}
}
///
/// Gets the Video engine (VID) utilization
///
public GPUUsageDomainStatus VideoEngine
{
get => UtilizationDomainsStatus.FirstOrDefault(status => status.Domain == UtilizationDomain.VideoEngine);
}
///
/// Enables dynamic performance states
///
public void EnableDynamicPerformanceStates()
{
GPUApi.EnableDynamicPStates(PhysicalGPU.Handle);
}
}
}