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); } } } } }
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); } }
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); }
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(); } }
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); }
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); } } }