/// <summary> /// Enumerates D3D devices for a particular adapter /// </summary> protected void EnumerateDevices(GraphicsAdapterInfo adapterInfo, ArrayList adapterFormatList) { DeviceType[] devTypeArray = new DeviceType[] { DeviceType.Hardware, DeviceType.Software, DeviceType.Reference }; foreach (DeviceType devType in devTypeArray) { GraphicsDeviceInfo deviceInfo = new GraphicsDeviceInfo(); deviceInfo.AdapterOrdinal = adapterInfo.AdapterOrdinal; deviceInfo.DevType = devType; try { deviceInfo.Caps = Manager.GetDeviceCaps(adapterInfo.AdapterOrdinal, devType); } catch (DirectXException) { continue; } // Get info for each devicecombo on this device EnumerateDeviceCombos(deviceInfo, adapterFormatList); // If at least one devicecombo for this device is found, // add the deviceInfo to the list if (deviceInfo.DeviceComboList.Count == 0) continue; adapterInfo.DeviceInfoList.Add(deviceInfo); } }
/// <summary> /// Respond to a change of windowed/fullscreen state by rebuilding the /// adapter format list, resolution list, and refresh rate list. /// Updating the selected adapter format will trigger updates of the /// rest of the dialog. /// </summary> private void WindowedFullscreenChanged(object sender, System.EventArgs e) { GraphicsAdapterInfo adapterInfo = (GraphicsAdapterInfo)adapterComboBox.SelectedItem; GraphicsDeviceInfo deviceInfo = (GraphicsDeviceInfo)deviceComboBox.SelectedItem; if (windowedRadioButton.Checked) { settings.IsWindowed = true; settings.WindowedAdapterInfo = adapterInfo; settings.WindowedDeviceInfo = deviceInfo; // Update adapter format combo box adapterFormatComboBox.Items.Clear(); adapterFormatComboBox.Items.Add(settings.WindowedDisplayMode.Format); adapterFormatComboBox.SelectedIndex = 0; adapterFormatComboBox.Enabled = false; // Update resolution combo box resolutionComboBox.Items.Clear(); resolutionComboBox.Items.Add(FormatResolution(settings.WindowedDisplayMode.Width, settings.WindowedDisplayMode.Height)); resolutionComboBox.SelectedIndex = 0; resolutionComboBox.Enabled = false; // Update refresh rate combo box refreshRateComboBox.Items.Clear(); refreshRateComboBox.Items.Add(FormatRefreshRate(settings.WindowedDisplayMode.RefreshRate)); refreshRateComboBox.SelectedIndex = 0; refreshRateComboBox.Enabled = false; } else { settings.IsWindowed = false; settings.FullscreenAdapterInfo = adapterInfo; settings.FullscreenDeviceInfo = deviceInfo; // Update adapter format combo box adapterFormatComboBox.Items.Clear(); foreach (DeviceCombo deviceCombo in deviceInfo.DeviceComboList) { if (deviceCombo.IsWindowed) { continue; } if (!adapterFormatComboBox.Items.Contains(deviceCombo.AdapterFormat)) { adapterFormatComboBox.Items.Add(deviceCombo.AdapterFormat); if (deviceCombo.AdapterFormat == (settings.IsWindowed ? settings.WindowedDisplayMode.Format : settings.FullscreenDisplayMode.Format)) { adapterFormatComboBox.SelectedItem = deviceCombo.AdapterFormat; } } } if (adapterFormatComboBox.SelectedItem == null && adapterFormatComboBox.Items.Count > 0) { adapterFormatComboBox.SelectedIndex = 0; } adapterFormatComboBox.Enabled = true; // Update resolution combo box resolutionComboBox.Enabled = true; // Update refresh rate combo box refreshRateComboBox.Enabled = true; } }
/// <summary> /// Enumerates available D3D adapters, devices, modes, etc. /// </summary> public void Enumerate() { foreach (AdapterInformation ai in Manager.Adapters) { ArrayList adapterFormatList = new ArrayList(); GraphicsAdapterInfo adapterInfo = new GraphicsAdapterInfo(); adapterInfo.AdapterOrdinal = ai.Adapter; adapterInfo.AdapterDetails = ai.Information; // Get list of all display modes on this adapter. // Also build a temporary list of all display adapter formats. foreach (DisplayMode displayMode in ai.SupportedDisplayModes) { if (displayMode.Width < AppMinFullscreenWidth) continue; if (displayMode.Height < AppMinFullscreenHeight) continue; if (GraphicsUtility.GetColorChannelBits(displayMode.Format) < AppMinColorChannelBits) continue; adapterInfo.DisplayModeList.Add(displayMode); if (!adapterFormatList.Contains(displayMode.Format)) adapterFormatList.Add(displayMode.Format); } // Sort displaymode list DisplayModeComparer dmc = new DisplayModeComparer(); adapterInfo.DisplayModeList.Sort(dmc); // Get info for each device on this adapter EnumerateDevices(adapterInfo, adapterFormatList); // If at least one device on this adapter is available and compatible // with the app, add the adapterInfo to the list if (adapterInfo.DeviceInfoList.Count == 0) continue; AdapterInfoList.Add(adapterInfo); } }
internal static List <GraphicsAdapterInfo> GetGraphicsAdapterListInPlatform() { var result = new List <GraphicsAdapterInfo>(); using (var dxgiFactory = Interop.Windows.DxgiFactory.GetInstance()) { if (dxgiFactory == null) { return(result); } foreach (var dxgiAdapter in dxgiFactory.EnumerateAdapters()) { if (dxgiAdapter == null) { continue; } using (dxgiAdapter) { var dxgiAdapterDescription = dxgiAdapter.GetDescription(); var graphicsAdapterInfo = new GraphicsAdapterInfo { Description = dxgiAdapterDescription.description, DeviceId = ParseDeviceId(dxgiAdapterDescription.deviceId), RevisionId = ParseRevisionId(dxgiAdapterDescription.revision), SubsystemDeviceId = ParseSubsystemDeviceId(dxgiAdapterDescription.subSysId), SubsystemVendorId = ParseSubsystemVendorId(dxgiAdapterDescription.subSysId), VendorId = ParseVendorId(dxgiAdapterDescription.vendorId) }; foreach (var dxgiOutput in dxgiAdapter.EnumerateOutputs()) { if (dxgiOutput == null) { continue; } using (dxgiOutput) { var dxgiOutputDescription = dxgiOutput.GetDescription(); var graphicsDisplayInfo = new GraphicsDisplayInfo { Name = dxgiOutputDescription.deviceName }; var monitorInfo = new Interop.Windows.MonitorInfoExW(); monitorInfo.size = Marshal.SizeOf(monitorInfo); var success = Interop.Windows.GetMonitorInfoW( dxgiOutputDescription.monitor, ref monitorInfo ); if (!success) { Logger.GetInstance(typeof(Windows)).Error("Can not get monitor info. error: " + Marshal.GetLastWin32Error()); continue; } var displayDevice = new Interop.Windows.DisplayDeviceW(); displayDevice.cb = Marshal.SizeOf(displayDevice); try { for (uint adapterId = 0; Interop.Windows.EnumDisplayDevicesW(null, adapterId, ref displayDevice, 0); adapterId++) { var adapterDeviceName = displayDevice.deviceName; if (string.IsNullOrWhiteSpace(adapterDeviceName)) { continue; } if (!adapterDeviceName.Equals(monitorInfo.DeviceName)) { continue; } for (uint monitorId = 0; Interop.Windows.EnumDisplayDevicesW(adapterDeviceName, monitorId, ref displayDevice, 0); monitorId++) { graphicsDisplayInfo.MonitorList.Add(new GraphicsMonitorInfo { Name = displayDevice.deviceName, Description = displayDevice.deviceString }); } } } catch (Exception e) { Logger.GetInstance(typeof(Windows)).Error($"{e}"); } graphicsAdapterInfo.DisplayList.Add(graphicsDisplayInfo); } } result.Add(graphicsAdapterInfo); } } } return(result); }