// Implementation /// <summary> /// Enumerates available D3D adapters, devices, modes, etc /// </summary> public static void Enumerate(IDeviceCreation acceptableCallback) { DisplayModeSorter sorter = new DisplayModeSorter(); try { // Store the callback deviceCreationInterface = acceptableCallback; // Clear the adapter information stored currently adapterInformationList.Clear(); ArrayList adapterFormatList = new ArrayList(); // Look through every adapter on the system foreach(AdapterInformation ai in Manager.Adapters) { EnumAdapterInformation adapterInfo = new EnumAdapterInformation(); // Store some information adapterInfo.AdapterOrdinal = (uint)ai.Adapter; // Ordinal adapterInfo.AdapterInformation = ai.Information; // Information // Get list of all display modes on this adapter. // Also build a temporary list of all display adapter formats. adapterFormatList.Clear(); // Now check to see which formats are supported for(int i = 0; i < allowedFormats.Length; i++) { // Check each of the supported display modes for this format foreach(DisplayMode dm in ai.SupportedDisplayModes[allowedFormats[i]]) { if ( (dm.Width < minimumWidth) || (dm.Height < minimumHeight) || (dm.Width > maximumWidth) || (dm.Height > maximumHeight) || (dm.RefreshRate < minimumRefresh) || (dm.RefreshRate > maximumRefresh) ) { continue; // This format isn't valid } // Add this to the list adapterInfo.displayModeList.Add(dm); // Add this to the format list if it doesn't already exist if (!adapterFormatList.Contains(dm.Format)) { adapterFormatList.Add(dm.Format); } } } // Get the adapter display mode DisplayMode currentAdapterMode = ai.CurrentDisplayMode; // Check to see if this format is in the list if (!adapterFormatList.Contains(currentAdapterMode.Format)) { adapterFormatList.Add(currentAdapterMode.Format); } // Sort the display mode list adapterInfo.displayModeList.Sort(sorter); // Get information for each device with this adapter EnumerateDevices(adapterInfo, adapterFormatList); // If there was at least one device on the adapter, and it's compatible // add it to the list if (adapterInfo.deviceInfoList.Count > 0) { adapterInformationList.Add(adapterInfo); } } // See if all of the descriptions are unique bool isUnique = true; for(int i = 0; i < adapterInformationList.Count; i++) { for (int j = i+1; j < adapterInformationList.Count; j++) { EnumAdapterInformation eai1 = adapterInformationList[i] as EnumAdapterInformation; EnumAdapterInformation eai2 = adapterInformationList[j] as EnumAdapterInformation; if (string.Compare(eai1.AdapterInformation.Description, eai2.AdapterInformation.Description, true) == 0) { isUnique = false; break; } } if (!isUnique) break; } // Now fill the unique description for(int i = 0; i < adapterInformationList.Count; i++) { EnumAdapterInformation eai1 = adapterInformationList[i] as EnumAdapterInformation; eai1.UniqueDescription = eai1.AdapterInformation.Description; // If the descriptions aren't unique, append the adapter ordinal if (!isUnique) eai1.UniqueDescription += string.Format(" (#{0})", eai1.AdapterOrdinal); } } catch (TypeLoadException) { // Couldn't load the manager class, no Direct is available. throw new NoDirect3DException(); } }
// Implementation /// <summary> /// Enumerates available D3D adapters, devices, modes, etc /// </summary> public static void Enumerate(IDeviceCreation acceptableCallback) { DisplayModeSorter sorter = new DisplayModeSorter(); try { // Store the callback deviceCreationInterface = acceptableCallback; // Clear the adapter information stored currently adapterInformationList.Clear(); ArrayList adapterFormatList = new ArrayList(); // Look through every adapter on the system foreach (AdapterInformation ai in Manager.Adapters) { EnumAdapterInformation adapterInfo = new EnumAdapterInformation(); // Store some information adapterInfo.AdapterOrdinal = (uint)ai.Adapter; // Ordinal adapterInfo.AdapterInformation = ai.Information; // Information // Get list of all display modes on this adapter. // Also build a temporary list of all display adapter formats. adapterFormatList.Clear(); // Now check to see which formats are supported for (int i = 0; i < allowedFormats.Length; i++) { // Check each of the supported display modes for this format foreach (DisplayMode dm in ai.SupportedDisplayModes[allowedFormats[i]]) { if ((dm.Width < minimumWidth) || (dm.Height < minimumHeight) || (dm.Width > maximumWidth) || (dm.Height > maximumHeight) || (dm.RefreshRate < minimumRefresh) || (dm.RefreshRate > maximumRefresh)) { continue; // This format isn't valid } // Add this to the list adapterInfo.displayModeList.Add(dm); // Add this to the format list if it doesn't already exist if (!adapterFormatList.Contains(dm.Format)) { adapterFormatList.Add(dm.Format); } } } // Get the adapter display mode DisplayMode currentAdapterMode = ai.CurrentDisplayMode; // Check to see if this format is in the list if (!adapterFormatList.Contains(currentAdapterMode.Format)) { adapterFormatList.Add(currentAdapterMode.Format); } // Sort the display mode list adapterInfo.displayModeList.Sort(sorter); // Get information for each device with this adapter EnumerateDevices(adapterInfo, adapterFormatList); // If there was at least one device on the adapter, and it's compatible // add it to the list if (adapterInfo.deviceInfoList.Count > 0) { adapterInformationList.Add(adapterInfo); } } // See if all of the descriptions are unique bool isUnique = true; for (int i = 0; i < adapterInformationList.Count; i++) { for (int j = i + 1; j < adapterInformationList.Count; j++) { EnumAdapterInformation eai1 = adapterInformationList[i] as EnumAdapterInformation; EnumAdapterInformation eai2 = adapterInformationList[j] as EnumAdapterInformation; if (string.Compare(eai1.AdapterInformation.Description, eai2.AdapterInformation.Description, true) == 0) { isUnique = false; break; } } if (!isUnique) { break; } } // Now fill the unique description for (int i = 0; i < adapterInformationList.Count; i++) { EnumAdapterInformation eai1 = adapterInformationList[i] as EnumAdapterInformation; eai1.UniqueDescription = eai1.AdapterInformation.Description; // If the descriptions aren't unique, append the adapter ordinal if (!isUnique) { eai1.UniqueDescription += string.Format(" (#{0})", eai1.AdapterOrdinal); } } } catch (TypeLoadException) { // Couldn't load the manager class, no Direct is available. throw new NoDirect3DException(); } }