using System.Linq;
using System.Runtime.InteropServices;
using NvAPIWrapper.Native.Attributes;
using NvAPIWrapper.Native.General.Structures;
using NvAPIWrapper.Native.GPU.Structures;
using NvAPIWrapper.Native.Helpers;
using NvAPIWrapper.Native.Interfaces;
namespace NvAPIWrapper.Native.Mosaic.Structures
{
///
/// Holds information about a topology validity status
///
[StructLayout(LayoutKind.Sequential, Pack = 8)]
[StructureVersion(1)]
public struct DisplayTopologyStatus : IInitializable
{
///
/// Maximum number of displays for this structure
///
public const int MaxDisplays =
PhysicalGPUHandle.PhysicalGPUs * Constants.Display.AdvancedDisplayHeads;
internal StructureVersion _Version;
internal readonly DisplayCapacityProblem _Errors;
internal readonly DisplayTopologyWarning _Warnings;
internal readonly uint _DisplayCounts;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MaxDisplays)]
internal Display[] _Displays;
///
/// Gets all error flags for this topology
///
public DisplayCapacityProblem Errors
{
get => _Errors;
}
///
/// Gets all warning flags for this topology
///
public DisplayTopologyWarning Warnings
{
get => _Warnings;
}
///
/// Gets per display statuses
///
public Display[] Displays
{
get => _Displays.Take((int) _DisplayCounts).ToArray();
}
///
/// Holds information about a display validity status in a topology
///
[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct Display
{
internal uint _DisplayId;
internal DisplayCapacityProblem _Errors;
internal DisplayTopologyWarning _Warnings;
internal uint _RawReserved;
///
/// Gets the Display identification of this display.
///
public uint DisplayId
{
get => _DisplayId;
}
///
/// Gets all error flags for this display
///
public DisplayCapacityProblem Errors
{
get => _Errors;
}
///
/// Gets all warning flags for this display
///
public DisplayTopologyWarning Warnings
{
get => _Warnings;
}
///
/// Indicates if this display can be rotated
///
public bool SupportsRotation
{
get => _RawReserved.GetBit(0);
}
}
}
}