private void CollectAvailableAdapters()
        {
            SystemCapabilities = new SystemCapabilities();

            if (_selectedGraphicsProfile == null)
            {
                // This sets _selectedAdapterCapabilities and _selectedRenderQuality
                SystemCapabilities.SelectRecommendedAdapter(out _selectedAdapterCapabilities, out _selectedRenderQuality);

                _selectedGraphicsProfile = _selectedAdapterCapabilities.GetGraphicsProfileForQuality(_selectedRenderQuality);
            }
            else
            {
                // This sets _selectedAdapterCapabilities and _selectedRenderQuality
                _selectedAdapterCapabilities = SystemCapabilities.CreateAdapterCapabilitiesFromGraphicsProfile(_selectedGraphicsProfile);

                var isCustomRenderQuality = IsCustomRenderQuality();

                if (isCustomRenderQuality)
                {
                    _selectedRenderQuality = AdapterCapabilitiesBase.RenderQualityTypes.Custom;
                }
                else
                {
                    _selectedRenderQuality = AdapterCapabilitiesBase.GetGraphicsProfileQuality(_selectedGraphicsProfile);
                }
            }
        }
        private void ChangeSelectedAdapter(AdapterCapabilitiesBase newSelectedAdapter)
        {
            _selectedAdapterCapabilities = newSelectedAdapter;

            if (_selectedRenderQuality == AdapterCapabilitiesBase.RenderQualityTypes.Custom)
            {
                _selectedRenderQuality = AdapterCapabilitiesBase.RenderQualityTypes.Normal;
            }

            _selectedGraphicsProfile = newSelectedAdapter.GetGraphicsProfileForQuality(_selectedRenderQuality);

            UpdateCustomSettingsComboBoxes();
        }
        private void CollectAvailableAdapters()
        {
            SystemCapabilities = new SystemCapabilities();

            if (_selectedGraphicsProfile == null)
            {
                // This sets _selectedAdapterCapabilities and _selectedRenderQuality
                SystemCapabilities.SelectRecommendedAdapter(out _selectedAdapterCapabilities, out _selectedRenderQuality);
                _selectedGraphicsProfile = _selectedAdapterCapabilities.GetGraphicsProfileForQuality(_selectedRenderQuality);
            }
            else
            {
                // This sets _selectedAdapterCapabilities and _selectedRenderQuality
                _selectedAdapterCapabilities = SystemCapabilities.CreateAdapterCapabilitiesFromGraphicsProfile(_selectedGraphicsProfile);
                _selectedRenderQuality       = GetExistingRenderQuality(_selectedGraphicsProfile);
            }
        }
        private void ChangeSelectedAdapter(AdapterCapabilitiesBase newSelectedAdapter)
        {
            if (_selectedGraphicsProfile.DriverType == GraphicsProfile.DriverTypes.Wpf3D && _selectedRenderQuality == AdapterCapabilitiesBase.RenderQualityTypes.Low)
            {
                _selectedRenderQuality = AdapterCapabilitiesBase.RenderQualityTypes.Normal;
            }

            _selectedAdapterCapabilities = newSelectedAdapter;

            if (_selectedRenderQuality == AdapterCapabilitiesBase.RenderQualityTypes.Custom)
            {
                _selectedRenderQuality = AdapterCapabilitiesBase.RenderQualityTypes.Normal;
            }

            _selectedGraphicsProfile = newSelectedAdapter.GetGraphicsProfileForQuality(_selectedRenderQuality);

            UpdateCustomSettingsComboBoxes();

            QualityComboBox.SelectedItem = _selectedRenderQuality;
        }
        private void QualityComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (!this.IsLoaded || _isInternalChange)
            {
                return;
            }

            _selectedRenderQuality = (AdapterCapabilitiesBase.RenderQualityTypes)QualityComboBox.SelectedItem;

            if (_selectedRenderQuality == AdapterCapabilitiesBase.RenderQualityTypes.Custom)
            {
                // When custom quality is selected we create a copy of the current graphics profile so we can safely change it
                _selectedGraphicsProfile = new GraphicsProfile(_selectedGraphicsProfile, _selectedGraphicsProfile.DefaultAdapter);
            }
            else
            {
                _selectedGraphicsProfile = _selectedAdapterCapabilities.GetGraphicsProfileForQuality(_selectedRenderQuality);
            }

            UpdateCustomSettingsComboBoxes();
        }
        internal void SelectRecommendedAdapter(out AdapterCapabilitiesBase bestAdapterCapabilities, out AdapterCapabilitiesBase.RenderQualityTypes renderQuality)
        {
            if (AllAdapterCapabilities == null || AllAdapterCapabilities.Count == 0 || !IsSupportedOS)
            {
#if LOGGING
                My.Log.Trace(Logger, "RecommendedAdapter: WPF 3D");
#endif

                bestAdapterCapabilities = WpfAdapterCapabilities;
                renderQuality           = AdapterCapabilitiesBase.RenderQualityTypes.Normal;

                return;
            }

            // First try to get dedicated graphics card from nvidia or ATI that has some dedicated video RAM and support at least 10.0 feature level

            // VendorID from http://gamedev.stackexchange.com/questions/31625/get-video-chipset-manufacturer-in-direct3d
            // Full list of vendors: http://www.pcidatabase.com/vendors.php?sort=id
            bestAdapterCapabilities = AllAdapterCapabilities.OfType <HardwareAdapterCapabilities>()
                                      .Where(a => a.IsSupported &&
                                             (a.AdapterDescription1.VendorId == 0x10DE ||                                            // NVidia
                                              a.AdapterDescription1.VendorId == 0x1002 || a.AdapterDescription1.VendorId == 0x1022)) // AMD
                                      .OrderByDescending(a => (long)a.AdapterDescription1.DedicatedVideoMemory)                      // Sort by DedicatedVideoMemory - we assume that more RAM means better card - so pick the one with most RAM (DedicatedVideoMemory is of type PointerSize - to be able to compare by it we need to convert it to long)

                                      .FirstOrDefault();

            if (bestAdapterCapabilities == null)
            {
                // If no NVidia or ATI graphics card was found than just take the first supported graphics card
                bestAdapterCapabilities = AllAdapterCapabilities.OfType <HardwareAdapterCapabilities>().FirstOrDefault(a => a.IsSupported);
            }

            if (bestAdapterCapabilities != null)
            {
                // Found the best dedicated graphics card
                // If the card is 11.0 feature level and has at least 1 GB RAM use High quality, else use Normal quality
                if ((int)bestAdapterCapabilities.DeviceCapabilities.FeatureLevel >= (int)FeatureLevel.Level_11_0 &&
                    bestAdapterCapabilities.AdapterDescription1.DedicatedVideoMemory >= 1000000000L)
                {
                    renderQuality = AdapterCapabilitiesBase.RenderQualityTypes.High;
                }
                else
                {
                    renderQuality = AdapterCapabilitiesBase.RenderQualityTypes.Normal;
                }
            }
            else
            {
                // No hardware graphics card - use software rendering
                bestAdapterCapabilities = SoftwareAdapterCapabilities;

                if (bestAdapterCapabilities != null)
                {
                    // no 10.0 feature level adapter found - we use software rendering
                    // Software rendering is highly optimized for multi-threading so more cores means we can afford better performance
                    if (Environment.ProcessorCount > 2)
                    {
                        renderQuality = AdapterCapabilitiesBase.RenderQualityTypes.Normal;
                    }
                    else
                    {
                        renderQuality = AdapterCapabilitiesBase.RenderQualityTypes.Low;
                    }
                }
                else
                {
                    // WPF 3D
                    bestAdapterCapabilities = WpfAdapterCapabilities;
                    renderQuality           = AdapterCapabilitiesBase.RenderQualityTypes.Normal;
                }
            }

#if LOGGING
            My.Log.Trace(Logger, "RecommendedAdapter: {0}; RenderQuality: {1}", bestAdapterCapabilities.DisplayName, renderQuality);
#endif
        }