public void SetDeviceCreationInterface(IDeviceCreation callback) { State.DeviceCreationInterface = callback; }
/// <summary> /// Creates a Direct3D device. If CreateWindow or SetWindow has not already /// been called, it will call CreateWindow with default parameters. /// Instead of calling this, you can call SetDevice or CreateDeviceFromSettings /// This is the CLS compliant version /// </summary> public void CreateDevice(int adapterOridinal, bool windowed, int suggestedWidth, int suggestedHeight, IDeviceCreation callback) { CreateDevice((uint)adapterOridinal, windowed, suggestedWidth, suggestedHeight, callback); }
// 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(); } }
/// <summary> /// Creates a Direct3D device. If CreateWindow or SetWindow has not already /// been called, it will call CreateWindow with default parameters. /// Instead of calling this, you can call SetDevice or CreateDeviceFromSettings /// </summary> public void CreateDevice(uint adapterOridinal, bool windowed, int suggestedWidth, int suggestedHeight, IDeviceCreation callback) { if (State.IsInsideDeviceCallback) throw new InvalidOperationException("You cannot create a window from inside a callback."); // Store callbacks in global state SetDeviceCreationInterface(callback); // Update device create being called State.WasDeviceCreateCalled = true; // Was the window created? If not, create it now if (!State.WasWindowCreated) { // If CreateWindow or SetWindow was already called and failed, then fail again. if (State.WasWindowCreateCalled) { throw new InvalidOperationException("CreateWindow was already called and failed."); } // Create a default window CreateWindow("Direct3D Window", null, null, -1, -1); } // Force an enumeration with the updated Device Acceptable callback Enumeration.Enumerate(State.DeviceCreationInterface); // Set up the match options MatchOptions match = new MatchOptions(); match.AdapterOrdinal = MatchType.PreserveInput; match.DeviceType = MatchType.IgnoreInput; match.Windowed = MatchType.PreserveInput; match.AdapterFormat = MatchType.IgnoreInput; match.VertexProcessing = MatchType.IgnoreInput; match.Resolution = MatchType.ClosestToInput; match.BackBufferFormat = MatchType.IgnoreInput; match.BackBufferCount = MatchType.IgnoreInput; match.MultiSample = MatchType.IgnoreInput; match.SwapEffect = MatchType.IgnoreInput; match.DepthFormat = MatchType.IgnoreInput; match.StencilFormat = MatchType.IgnoreInput; match.PresentFlags = MatchType.IgnoreInput; match.RefreshRate = MatchType.IgnoreInput; match.PresentInterval = MatchType.IgnoreInput; // Get the device settings DeviceSettings settings = new DeviceSettings(); settings.presentParams = new PresentParameters(); settings.AdapterOrdinal = adapterOridinal; settings.presentParams.Windowed = windowed; settings.presentParams.BackBufferWidth = suggestedWidth; settings.presentParams.BackBufferHeight = suggestedHeight; // Override with settings for command line if (State.OverrideWidth != 0) settings.presentParams.BackBufferWidth = State.OverrideWidth; if (State.OverrideHeight != 0) settings.presentParams.BackBufferHeight = State.OverrideHeight; if (State.OverrideAdapterOrdinal != -1) settings.AdapterOrdinal = (uint)State.OverrideAdapterOrdinal; if (State.IsOverridingFullScreen) { settings.presentParams.Windowed = false; if ((State.OverrideWidth == 0) && (State.OverrideHeight == 0)) match.Resolution = MatchType.IgnoreInput; } if (State.IsOverridingWindowed) settings.presentParams.Windowed = true; if (State.IsOverridingForceHardware) { settings.DeviceType = DeviceType.Hardware; match.DeviceType = MatchType.PreserveInput; } if (State.IsOverridingForceReference) { settings.DeviceType = DeviceType.Reference; match.DeviceType = MatchType.PreserveInput; } if (State.IsOverridingForcePureHardwareVertexProcessing) { settings.BehaviorFlags = CreateFlags.HardwareVertexProcessing | CreateFlags.PureDevice; match.VertexProcessing = MatchType.PreserveInput; } if (State.IsOverridingForceHardwareVertexProcessing) { settings.BehaviorFlags = CreateFlags.HardwareVertexProcessing; match.VertexProcessing = MatchType.PreserveInput; } if (State.IsOverridingForceSoftwareVertexProcessing) { settings.BehaviorFlags = CreateFlags.SoftwareVertexProcessing; match.VertexProcessing = MatchType.PreserveInput; } try { settings = FindValidDeviceSettings(settings, match); } catch(Exception e) { DisplayErrorMessage(e); throw; } // If the modify device callback isn't null, call it to // let the app change the settings if (State.DeviceCreationInterface != null) { Caps c = Manager.GetDeviceCaps((int)settings.AdapterOrdinal, settings.DeviceType); State.DeviceCreationInterface.ModifyDeviceSettings(settings, c); } // Change to a Direct3D device created from the new device settings // If there is an existing device, either reset or recreate ChangeDevice(settings, null, false); }
// 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(); } }