/// <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);
        }
    }
Example #4
0
            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);
            }