Ejemplo n.º 1
0
 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;
 }
Ejemplo n.º 2
0
        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);
                }
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }