Ejemplo n.º 1
0
        static void EnumerateSettingsCombos(AdapterInfo10 adapterInfo)
        {
            Format[] backBufferFormats = { Format.R8G8B8A8_UNorm,     Format.R8G8B8A8_UNorm_SRGB,
                                           Format.R16G16B16A16_Float, Format.R10G10B10A2_UNorm };

            foreach (OutputInfo10 outputInfo in adapterInfo.Outputs)
            {
                foreach (DeviceInfo10 deviceInfo in adapterInfo.Devices)
                {
                    foreach (Format backBufferFormat in backBufferFormats)
                    {
                        if (MinimumSettings != null && MinimumSettings.BackBufferFormat != SlimDX.DXGI.Format.Unknown &&
                            MinimumSettings.BackBufferFormat != backBufferFormat)
                        {
                            continue;
                        }

                        for (int windowed = 0; windowed < 2; windowed++)
                        {
                            if (windowed == 0 && outputInfo.DisplayModes.Count == 0)
                            {
                                continue;
                            }

                            bool found = false;
                            foreach (ModeDescription mode in outputInfo.DisplayModes)
                            {
                                if (mode.Format == backBufferFormat)
                                {
                                    found = true;
                                    break;
                                }
                            }
                            if (!found)
                            {
                                continue;
                            }

                            SettingsCombo10 combo = new SettingsCombo10();
                            combo.AdapterOrdinal   = deviceInfo.AdapterOrdinal;
                            combo.DriverType       = deviceInfo.DriverType;
                            combo.BackBufferFormat = backBufferFormat;
                            combo.IsWindowed       = (windowed != 0);
                            combo.OutputOrdinal    = outputInfo.OutputOrdinal;
                            combo.OutputInfo       = outputInfo;

                            BuildMultisampleList(backBufferFormat, combo);

                            if (MinimumSettings != null && !combo.MultisampleCounts.Contains(MinimumSettings.MultisampleCount))
                            {
                                continue;
                            }

                            adapterInfo.SettingsCombos.Add(combo);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        static void EnumerateDevices(AdapterInfo10 adapterInfo)
        {
            DriverType[] allowedTypes = { DriverType.Hardware, DriverType.Reference };

            foreach (DriverType type in allowedTypes)
            {
                if (MinimumSettings != null && type != MinimumSettings.DeviceType)
                {
                    continue;
                }

                DeviceInfo10 deviceInfo = new DeviceInfo10();
                deviceInfo.AdapterOrdinal = adapterInfo.AdapterOrdinal;
                deviceInfo.DriverType     = type;
                SlimDX.Direct3D10.Device device;

                try
                {
                    Adapter adapter = null;
                    if (type == DriverType.Hardware)
                    {
                        adapter = adapterInfo.Adapter;
                    }
                    device = new SlimDX.Direct3D10.Device(adapter, type, DeviceCreationFlags.None);
                }
                catch (Direct3D10Exception)
                {
                    // swallow the exception
                    continue;
                }


                // if the driver type is not hardware, create a DXGI device and GetAdapter
                // from it to replace adapterInfo.Adapter
                if (type != DriverType.Hardware)
                {
                    SlimDX.DXGI.Device dxgiDevice = new SlimDX.DXGI.Device(device);
                    if (adapterInfo.Adapter != null)
                    {
                        adapterInfo.Adapter.Dispose();
                    }
                    adapterInfo.Adapter = dxgiDevice.Adapter;
                    dxgiDevice.Dispose();
                }

                device.Dispose();
                adapterInfo.Devices.Add(deviceInfo);
            }
        }
Ejemplo n.º 3
0
        public static OutputInfo10 GetOutputInfo(int adapterOrdinal, int outputOrdinal)
        {
            AdapterInfo10 adapter = null;

            foreach (AdapterInfo10 a in Adapters)
            {
                if (adapterOrdinal == a.AdapterOrdinal)
                {
                    adapter = a;
                    break;
                }
            }

            if (adapter != null && adapter.Outputs.Count > outputOrdinal)
            {
                return(adapter.Outputs[outputOrdinal]);
            }
            return(null);
        }
Ejemplo n.º 4
0
        static void EnumerateOutputs(AdapterInfo10 adapterInfo)
        {
            for (int i = 0; i < adapterInfo.Adapter.GetOutputCount(); i++)
            {
                Output output = adapterInfo.Adapter.GetOutput(i);

                OutputInfo10 outputInfo = new OutputInfo10();
                outputInfo.OutputDescription = output.Description;
                outputInfo.OutputOrdinal     = i;
                outputInfo.Output            = output;

                EnumerateDisplayModes(outputInfo);
                if (outputInfo.DisplayModes.Count == 0)
                {
                    continue;
                }

                adapterInfo.Outputs.Add(outputInfo);
                output.Dispose();
            }
        }
Ejemplo n.º 5
0
        int GetAdapterOrdinal(IntPtr screen)
        {
            AdapterInfo10 adapter = null;

            foreach (AdapterInfo10 a in Enumeration10.Adapters)
            {
                foreach (OutputInfo10 o in a.Outputs)
                {
                    if (o.OutputDescription.Name == game.Window.Screen.DeviceName)
                    {
                        adapter = a;
                        break;
                    }
                }
            }

            if (adapter != null)
            {
                return(adapter.AdapterOrdinal);
            }

            return(-1);
        }
Ejemplo n.º 6
0
        public static void Enumerate()
        {
            HasEnumerated = true;
            Adapters      = new List <AdapterInfo10>();

            for (int i = 0; i < GraphicsDeviceManager.Factory.GetAdapterCount(); i++)
            {
                Adapter adapter = GraphicsDeviceManager.Factory.GetAdapter(i);

                AdapterInfo10 adapterInfo = new AdapterInfo10();
                adapterInfo.AdapterOrdinal     = i;
                adapterInfo.AdapterDescription = adapter.Description;
                adapterInfo.Adapter            = adapter;

                EnumerateDevices(adapterInfo);
                if (adapterInfo.Devices.Count == 0)
                {
                    continue;
                }

                EnumerateOutputs(adapterInfo);
                if (adapterInfo.Outputs.Count == 0)
                {
                    continue;
                }

                EnumerateSettingsCombos(adapterInfo);
                if (adapterInfo.SettingsCombos.Count == 0)
                {
                    continue;
                }

                Adapters.Add(adapterInfo);
            }

            bool unique = true;

            foreach (AdapterInfo10 adapter1 in Adapters)
            {
                foreach (AdapterInfo10 adapter2 in Adapters)
                {
                    if (adapter1 == adapter2)
                    {
                        continue;
                    }
                    if (adapter1.AdapterDescription.Description == adapter2.AdapterDescription.Description)
                    {
                        unique = false;
                        break;
                    }
                }

                if (!unique)
                {
                    break;
                }
            }

            foreach (AdapterInfo10 info in Adapters)
            {
                info.Description = info.AdapterDescription.Description;
                if (!unique)
                {
                    info.Description += " " + info.AdapterOrdinal.ToString(CultureInfo.CurrentCulture);
                }
            }
        }