#region License /* FNA - XNA4 Reimplementation for Desktop Platforms * Copyright 2009-2020 Ethan Lee and the MonoGame Team * * Released under the Microsoft Public License. * See LICENSE for details. */ #endregion #region Using Statements using System; using System.Collections.ObjectModel; #endregion namespace Microsoft.Xna.Framework.Graphics { public sealed class GraphicsAdapter { #region Public Properties public DisplayMode CurrentDisplayMode { get { return FNAPlatform.GetCurrentDisplayMode( Adapters.IndexOf(this) ); } } public DisplayModeCollection SupportedDisplayModes { get; private set; } public string Description { get; private set; } public int DeviceId { get { throw new NotImplementedException(); } } public string DeviceName { get; private set; } public bool IsDefaultAdapter { get { return this == DefaultAdapter; } } /// /// Gets a indicating whether /// has a /// Width:Height ratio corresponding to a widescreen . /// Common widescreen modes include 16:9, 16:10 and 2:1. /// public bool IsWideScreen { get { /* Common non-widescreen modes: 4:3, 5:4, 1:1 * Common widescreen modes: 16:9, 16:10, 2:1 * XNA does not appear to account for rotated displays on the desktop */ const float limit = 4.0f / 3.0f; float aspect = CurrentDisplayMode.AspectRatio; return aspect > limit; } } public IntPtr MonitorHandle { get { throw new NotImplementedException(); } } public int Revision { get { throw new NotImplementedException(); } } public int SubSystemId { get { throw new NotImplementedException(); } } public bool UseNullDevice { get; set; } public bool UseReferenceDevice { get; set; } public int VendorId { get { throw new NotImplementedException(); } } #endregion #region Public Static Properties public static GraphicsAdapter DefaultAdapter { get { return Adapters[0]; } } public static ReadOnlyCollection Adapters { get { if (adapters == null) { adapters = new ReadOnlyCollection( FNAPlatform.GetGraphicsAdapters() ); } return adapters; } } #endregion #region Private Static Variables private static ReadOnlyCollection adapters; #endregion #region Internal Constructor internal GraphicsAdapter( DisplayModeCollection modes, string name, string description ) { SupportedDisplayModes = modes; DeviceName = name; Description = description; UseNullDevice = false; UseReferenceDevice = false; } #endregion #region Public Methods public bool IsProfileSupported(GraphicsProfile graphicsProfile) { /* TODO: This method could be genuinely useful! * Maybe look into the difference between Reach/HiDef and add the * appropriate properties to the GLDevice. * -flibit */ return true; } public bool QueryRenderTargetFormat( GraphicsProfile graphicsProfile, SurfaceFormat format, DepthFormat depthFormat, int multiSampleCount, out SurfaceFormat selectedFormat, out DepthFormat selectedDepthFormat, out int selectedMultiSampleCount ) { /* Per the OpenGL 3.0 Specification, section 3.9.1, * under "Required Texture Formats". These are the * formats required for renderbuffer support. * * TODO: Per the 4.5 Specification, section 8.5.1, * RGB565, RGB5_A1, RGBA4 are also supported. * -flibit */ if ( format != SurfaceFormat.Color && format != SurfaceFormat.Rgba1010102 && format != SurfaceFormat.Rg32 && format != SurfaceFormat.Rgba64 && format != SurfaceFormat.Single && format != SurfaceFormat.Vector2 && format != SurfaceFormat.Vector4 && format != SurfaceFormat.HalfSingle && format != SurfaceFormat.HalfVector2 && format != SurfaceFormat.HalfVector4 && format != SurfaceFormat.HdrBlendable ) { selectedFormat = SurfaceFormat.Color; } else { selectedFormat = format; } selectedDepthFormat = depthFormat; selectedMultiSampleCount = 0; // Okay, sure, sorry. return ( format == selectedFormat && depthFormat == selectedDepthFormat && multiSampleCount == selectedMultiSampleCount ); } public bool QueryBackBufferFormat( GraphicsProfile graphicsProfile, SurfaceFormat format, DepthFormat depthFormat, int multiSampleCount, out SurfaceFormat selectedFormat, out DepthFormat selectedDepthFormat, out int selectedMultiSampleCount) { selectedFormat = SurfaceFormat.Color; // Seriously? selectedDepthFormat = depthFormat; selectedMultiSampleCount = 0; // Okay, sure, sorry. return ( format == selectedFormat && depthFormat == selectedDepthFormat && multiSampleCount == selectedMultiSampleCount ); } #endregion } }