void PropogateSettings() { CurrentSettings.BackBufferCount = CurrentSettings.Direct3D10.SwapChainDescription.BufferCount; CurrentSettings.BackBufferWidth = CurrentSettings.Direct3D10.SwapChainDescription.ModeDescription.Width; CurrentSettings.BackBufferHeight = CurrentSettings.Direct3D10.SwapChainDescription.ModeDescription.Height; CurrentSettings.BackBufferFormat = CurrentSettings.Direct3D10.SwapChainDescription.ModeDescription.Format; CurrentSettings.DepthStencilFormat = CurrentSettings.Direct3D10.DepthStencilFormat; CurrentSettings.DeviceType = CurrentSettings.Direct3D10.DriverType; CurrentSettings.MultisampleQuality = CurrentSettings.Direct3D10.SwapChainDescription.SampleDescription.Quality; CurrentSettings.MultisampleCount = CurrentSettings.Direct3D10.SwapChainDescription.SampleDescription.Count; CurrentSettings.RefreshRate = (int)ConversionMethods.ToFloat(CurrentSettings.Direct3D10.SwapChainDescription.ModeDescription.RefreshRate); CurrentSettings.Windowed = CurrentSettings.Direct3D10.SwapChainDescription.IsWindowed; }
static void EnumerateDisplayModes(OutputInfo10 outputInfo) { Format[] allowedFormats = { Format.R8G8B8A8_UNorm, Format.R8G8B8A8_UNorm_SRGB, Format.R16G16B16A16_Float, Format.R10G10B10A2_UNorm }; foreach (Format format in allowedFormats) { ReadOnlyCollection <ModeDescription> modes = outputInfo.Output.GetDisplayModeList(format, DisplayModeEnumerationFlags.Scaling); foreach (ModeDescription mode in modes) { if (MinimumSettings != null) { if (mode.Width < MinimumSettings.BackBufferWidth || mode.Height < MinimumSettings.BackBufferHeight || (int)ConversionMethods.ToFloat(mode.RefreshRate) < MinimumSettings.RefreshRate) { continue; } } outputInfo.DisplayModes.Add(mode); } } }
public static Direct3D10Settings BuildValidSettings(SettingsCombo10 combo, Direct3D10Settings input) { Direct3D10Settings settings = new Direct3D10Settings(); SwapChainDescription scd = new SwapChainDescription(); ModeDescription mode = new ModeDescription(); SampleDescription sample = new SampleDescription(); ModeDescription bestDisplayMode = FindValidResolution(combo, input); if (combo.IsWindowed) { bestDisplayMode.RefreshRate = new Rational(0, 0); } else { Rational match = input.SwapChainDescription.ModeDescription.RefreshRate; bestDisplayMode.RefreshRate = new Rational(0, 0); if (match != new Rational(0, 0)) { float bestRanking = 100000; foreach (ModeDescription displayMode in combo.OutputInfo.DisplayModes) { if (displayMode.Width != bestDisplayMode.Width || displayMode.Height != bestDisplayMode.Height) { continue; } float ranking = Math.Abs(ConversionMethods.ToFloat(displayMode.RefreshRate) - ConversionMethods.ToFloat(match)); if (ranking < bestRanking) { bestDisplayMode.RefreshRate = displayMode.RefreshRate; bestRanking = ranking; if (bestRanking == 0) { break; } } } } } int bestBackBufferCount = input.SwapChainDescription.BufferCount; if (bestBackBufferCount > 3) { bestBackBufferCount = 3; } if (bestBackBufferCount < 1) { bestBackBufferCount = 1; } int bestCount; int bestQuality; if (input.SwapChainDescription.SwapEffect != SwapEffect.Discard) { bestCount = 1; bestQuality = 0; } else { bestCount = 1; bestQuality = 0; for (int i = 0; i < combo.MultisampleCounts.Count; i++) { int type = combo.MultisampleCounts[i]; int quality = combo.MultisampleQualities[0]; if (Math.Abs(type - input.SwapChainDescription.SampleDescription.Count) < Math.Abs(bestCount - input.SwapChainDescription.SampleDescription.Count)) { bestCount = type; bestQuality = Math.Min(quality - 1, input.SwapChainDescription.SampleDescription.Quality); } } } int bestSyncInterval = input.SyncInterval; if (combo.DriverType == DriverType.Reference) { bestSyncInterval = 0; } mode.Width = bestDisplayMode.Width; mode.Height = bestDisplayMode.Height; mode.Format = combo.BackBufferFormat; mode.RefreshRate = bestDisplayMode.RefreshRate; sample.Count = bestCount; sample.Quality = bestQuality; scd.Usage = input.SwapChainDescription.Usage | Usage.RenderTargetOutput; scd.BufferCount = bestBackBufferCount; scd.SwapEffect = input.SwapChainDescription.SwapEffect; scd.IsWindowed = combo.IsWindowed; scd.Flags = SwapChainFlags.None; scd.ModeDescription = mode; scd.SampleDescription = sample; settings.AdapterOrdinal = combo.AdapterOrdinal; settings.DriverType = combo.DriverType; settings.OutputOrdinal = combo.OutputOrdinal; settings.SyncInterval = bestSyncInterval; settings.DepthStencilFormat = input.DepthStencilFormat; settings.CreationFlags = input.CreationFlags; settings.SwapChainDescription = scd; return(settings); }
public static float RankSettingsCombo(SettingsCombo10 combo, Direct3D10Settings optimal) { float ranking = 0.0f; if (combo.AdapterOrdinal == optimal.AdapterOrdinal) { ranking += 1000.0f; } if (combo.OutputOrdinal == optimal.OutputOrdinal) { ranking += 500.0f; } if (combo.DriverType == optimal.DriverType) { ranking += 100.0f; } if (combo.DriverType == DriverType.Hardware) { ranking += 0.1f; } if (combo.IsWindowed == optimal.SwapChainDescription.IsWindowed) { ranking += 10.0f; } if (combo.BackBufferFormat == optimal.SwapChainDescription.ModeDescription.Format) { ranking += 1.0f; } else { int bitDepthDelta = Math.Abs(ConversionMethods.GetColorBits(combo.BackBufferFormat) - ConversionMethods.GetColorBits(optimal.SwapChainDescription.ModeDescription.Format)); float scale = Math.Max(0.9f - bitDepthDelta * 0.2f, 0.0f); ranking += scale; } for (int i = 0; i < combo.MultisampleCounts.Count; i++) { int type = combo.MultisampleCounts[i]; int quality = combo.MultisampleQualities[i]; if (type == optimal.SwapChainDescription.SampleDescription.Count && quality > optimal.SwapChainDescription.SampleDescription.Quality) { ranking += 1.0f; break; } } foreach (ModeDescription mode in combo.OutputInfo.DisplayModes) { if (mode.Width == optimal.SwapChainDescription.ModeDescription.Width && mode.Height == optimal.SwapChainDescription.ModeDescription.Height) { ranking += 1.0f; break; } } foreach (ModeDescription mode in combo.OutputInfo.DisplayModes) { if (Math.Abs(ConversionMethods.ToFloat(mode.RefreshRate) - ConversionMethods.ToFloat(optimal.SwapChainDescription.ModeDescription.RefreshRate)) < 0.1f) { ranking += 1.0f; break; } } return(ranking); }