public static IReadOnlyList <DXGI_MODE_DESC> GetDisplayModeList(this IDXGIOutput output, DXGI_FORMAT format, DXGI_ENUM_MODES modes) { if (output == null) { throw new ArgumentNullException(nameof(output)); } // DXGI_FORMAT_R16G16B16A16_FLOAT // DXGI_FORMAT_R10G10B10A2_UNORM // DXGI_FORMAT_R8G8B8A8_UNORM // DXGI_FORMAT_R8G8B8A8_UNORM_SRGB // DXGI_FORMAT_B8G8R8A8_UNORM // DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM // DXGI_FORMAT_B8G8R8A8_UNORM_SRGB var list = new List <DXGI_MODE_DESC>(); uint num = 0; output.GetDisplayModeList(format, (uint)modes, ref num, null); if (num > 0) { var array = new DXGI_MODE_DESC[num]; output.GetDisplayModeList(format, (uint)modes, ref num, array); list.AddRange(array); } return(list); }
/// <summary> /// Initializes a new instance of the <see cref="EngineOutputInfo" /> class. /// </summary> internal EngineOutputInfo(int adapterIndex, int outputIndex, IDXGIOutput output) { this.AdapterIndex = adapterIndex; this.OutputIndex = outputIndex; _outputDescription = output.Description; // Get all supported modes var modes = output.GetDisplayModeList( GraphicsHelper.Internals.DEFAULT_TEXTURE_FORMAT, DisplayModeEnumerationFlags.Interlaced); // Convert and sort them var engineModes = new EngineOutputModeInfo[modes.Length]; for (var loop = 0; loop < engineModes.Length; loop++) { engineModes[loop] = new EngineOutputModeInfo(this, modes[loop]); } Array.Sort(engineModes, (left, right) => { var result = left.PixelCount.CompareTo(right.PixelCount); if (result == 0) { result = left.RefreshRateNumerator.CompareTo(right.RefreshRateNumerator); } return(result); }); // Strip them (we want to have each relevant mode once) var strippedModeList = new List <EngineOutputModeInfo>(engineModes.Length); var lastOutputMode = new EngineOutputModeInfo(); for (var loop = engineModes.Length - 1; loop > -1; loop--) { if (!engineModes[loop].Equals(lastOutputMode)) { lastOutputMode = engineModes[loop]; strippedModeList.Add(lastOutputMode); } } // Store mode list this.SupportedModes = strippedModeList.ToArray(); }