public virtual List <GraphicsDeviceInformation> FindBestDevices(GameGraphicsParameters preferredParameters) { var graphicsDeviceInfos = new List <GraphicsDeviceInformation>(); // Iterate on each adapter foreach (var graphicsAdapter in GraphicsAdapterFactory.Adapters) { if (!string.IsNullOrEmpty(preferredParameters.RequiredAdapterUid) && graphicsAdapter.AdapterUid != preferredParameters.RequiredAdapterUid) { continue; } // Skip adapeters that don't have graphics output // but only if no RequiredAdapterUid is provided (OculusVR at init time might be in a device with no outputs) if (graphicsAdapter.Outputs.Length == 0 && string.IsNullOrEmpty(preferredParameters.RequiredAdapterUid)) { continue; } var preferredGraphicsProfiles = preferredParameters.PreferredGraphicsProfile; // Iterate on each preferred graphics profile foreach (var featureLevel in preferredGraphicsProfiles) { var deviceInfo = new GraphicsDeviceInformation { Adapter = graphicsAdapter, GraphicsProfile = featureLevel, PresentationParameters = { MultisampleCount = preferredParameters.PreferredMultisampleCount, IsFullScreen = preferredParameters.IsFullScreen, PreferredFullScreenOutputIndex = preferredParameters.PreferredFullScreenOutputIndex, PresentationInterval = preferredParameters.SynchronizeWithVerticalRetrace ? PresentInterval.One : PresentInterval.Immediate, DeviceWindowHandle = MainWindow.NativeWindow, ColorSpace = preferredParameters.ColorSpace, }, }; var preferredMode = new DisplayMode(preferredParameters.PreferredBackBufferFormat, preferredParameters.PreferredBackBufferWidth, preferredParameters.PreferredBackBufferHeight, preferredParameters.PreferredRefreshRate); // just add it and continue AddDevice(preferredMode, deviceInfo, preferredParameters, graphicsDeviceInfos); break; } } return(graphicsDeviceInfos); }
public override List <GraphicsDeviceInformation> FindBestDevices(GameGraphicsParameters preferredParameters) { var graphicsDeviceInfos = base.FindBestDevices(preferredParameters); // Special case where the default FindBestDevices is not working if (graphicsDeviceInfos.Count == 0) { var graphicsAdapter = GraphicsAdapterFactory.Adapters[0]; // Iterate on each preferred graphics profile foreach (var featureLevel in preferredParameters.PreferredGraphicsProfile) { // Check if this profile is supported. if (graphicsAdapter.IsProfileSupported(featureLevel)) { var deviceInfo = new GraphicsDeviceInformation { Adapter = graphicsAdapter, GraphicsProfile = featureLevel, PresentationParameters = { MultisampleCount = preferredParameters.PreferredMultisampleCount, IsFullScreen = preferredParameters.IsFullScreen, PresentationInterval = preferredParameters.SynchronizeWithVerticalRetrace ? PresentInterval.One : PresentInterval.Immediate, DeviceWindowHandle = MainWindow.NativeWindow, } }; // Hardcoded format and refresh rate... // This is a workaround to allow this code to work inside the emulator // but this is not really robust // TODO: Check how to handle this case properly var displayMode = new DisplayMode(PixelFormat.B8G8R8A8_UNorm, gameWindow.ClientBounds.Width, gameWindow.ClientBounds.Height, new Rational(60, 1)); AddDevice(displayMode, deviceInfo, preferredParameters, graphicsDeviceInfos); // If the profile is supported, we are just using the first best one break; } } } return(graphicsDeviceInfos); }
public override List <GraphicsDeviceInformation> FindBestDevices(GameGraphicsParameters preferredParameters) { var gameWindowiOS = gameWindow as GameWindowiOS; if (gameWindowiOS != null) { var graphicsAdapter = GraphicsAdapterFactory.Default; var graphicsDeviceInfos = new List <GraphicsDeviceInformation>(); var preferredGraphicsProfiles = preferredParameters.PreferredGraphicsProfile; foreach (var featureLevel in preferredGraphicsProfiles) { // Check if this profile is supported. if (graphicsAdapter.IsProfileSupported(featureLevel)) { // Everything is already created at this point, just transmit what has been done var deviceInfo = new GraphicsDeviceInformation { Adapter = GraphicsAdapterFactory.Default, GraphicsProfile = featureLevel, PresentationParameters = new PresentationParameters(preferredParameters.PreferredBackBufferWidth, preferredParameters.PreferredBackBufferHeight, gameWindowiOS.NativeWindow) { // TODO: PDX-364: Transmit what was actually created BackBufferFormat = preferredParameters.PreferredBackBufferFormat, DepthStencilFormat = preferredParameters.PreferredDepthStencilFormat, } }; graphicsDeviceInfos.Add(deviceInfo); // If the profile is supported, we are just using the first best one break; } } return(graphicsDeviceInfos); } return(base.FindBestDevices(preferredParameters)); }
public virtual List <GraphicsDeviceInformation> FindBestDevices(GameGraphicsParameters preferredParameters) { var graphicsDeviceInfos = new List <GraphicsDeviceInformation>(); // Iterate on each adapter foreach (var graphicsAdapter in GraphicsAdapterFactory.Adapters) { if (!string.IsNullOrEmpty(preferredParameters.RequiredAdapterUid) && graphicsAdapter.AdapterUid != preferredParameters.RequiredAdapterUid) { continue; } // Skip adapeters that don't have graphics output // but only if no RequiredAdapterUid is provided (OculusVR at init time might be in a device with no outputs) if (graphicsAdapter.Outputs.Length == 0 && string.IsNullOrEmpty(preferredParameters.RequiredAdapterUid)) { continue; } var preferredGraphicsProfiles = preferredParameters.PreferredGraphicsProfile; // Iterate on each preferred graphics profile foreach (var featureLevel in preferredGraphicsProfiles) { // Check if this profile is supported. if (graphicsAdapter.IsProfileSupported(featureLevel)) { var deviceInfo = new GraphicsDeviceInformation { Adapter = graphicsAdapter, GraphicsProfile = featureLevel, PresentationParameters = { MultisampleCount = preferredParameters.PreferredMultisampleCount, IsFullScreen = preferredParameters.IsFullScreen, PreferredFullScreenOutputIndex = preferredParameters.PreferredFullScreenOutputIndex, PresentationInterval = preferredParameters.SynchronizeWithVerticalRetrace ? PresentInterval.One : PresentInterval.Immediate, DeviceWindowHandle = MainWindow.NativeWindow, ColorSpace = preferredParameters.ColorSpace, }, }; var preferredMode = new DisplayMode(preferredParameters.PreferredBackBufferFormat, preferredParameters.PreferredBackBufferWidth, preferredParameters.PreferredBackBufferHeight, preferredParameters.PreferredRefreshRate); // if we want to switch to fullscreen, try to find only needed output, otherwise check them all if (preferredParameters.IsFullScreen) { if (preferredParameters.PreferredFullScreenOutputIndex < graphicsAdapter.Outputs.Length) { var output = graphicsAdapter.Outputs[preferredParameters.PreferredFullScreenOutputIndex]; var displayMode = output.FindClosestMatchingDisplayMode(preferredGraphicsProfiles, preferredMode); AddDevice(displayMode, deviceInfo, preferredParameters, graphicsDeviceInfos); } } else { AddDevice(preferredMode, deviceInfo, preferredParameters, graphicsDeviceInfos); } // If the profile is supported, we are just using the first best one break; } } } return(graphicsDeviceInfos); }
protected void AddDevice(DisplayMode mode, GraphicsDeviceInformation deviceBaseInfo, GameGraphicsParameters preferredParameters, List <GraphicsDeviceInformation> graphicsDeviceInfos) { // TODO: Temporary woraround if (mode == null) { mode = new DisplayMode(PixelFormat.R8G8B8A8_UNorm, 800, 480, new Rational(60, 1)); } var deviceInfo = deviceBaseInfo.Clone(); deviceInfo.PresentationParameters.RefreshRate = mode.RefreshRate; if (preferredParameters.IsFullScreen) { deviceInfo.PresentationParameters.BackBufferFormat = mode.Format; deviceInfo.PresentationParameters.BackBufferWidth = mode.Width; deviceInfo.PresentationParameters.BackBufferHeight = mode.Height; } else { deviceInfo.PresentationParameters.BackBufferFormat = preferredParameters.PreferredBackBufferFormat; deviceInfo.PresentationParameters.BackBufferWidth = preferredParameters.PreferredBackBufferWidth; deviceInfo.PresentationParameters.BackBufferHeight = preferredParameters.PreferredBackBufferHeight; } deviceInfo.PresentationParameters.DepthStencilFormat = preferredParameters.PreferredDepthStencilFormat; deviceInfo.PresentationParameters.MultisampleCount = preferredParameters.PreferredMultisampleCount; if (!graphicsDeviceInfos.Contains(deviceInfo)) { graphicsDeviceInfos.Add(deviceInfo); } }
/// <summary> /// Finds the best device that is compatible with the preferences defined in this instance. /// </summary> /// <param name="anySuitableDevice">if set to <c>true</c> a device can be selected from any existing adapters, otherwise, it will select only from default adapter.</param> /// <returns>The graphics device information.</returns> protected virtual GraphicsDeviceInformation FindBestDevice(bool anySuitableDevice) { // Setup preferred parameters before passing them to the factory var preferredParameters = new GameGraphicsParameters { PreferredBackBufferWidth = PreferredBackBufferWidth, PreferredBackBufferHeight = PreferredBackBufferHeight, PreferredBackBufferFormat = PreferredBackBufferFormat, PreferredDepthStencilFormat = PreferredDepthStencilFormat, PreferredRefreshRate = PreferredRefreshRate, PreferredFullScreenOutputIndex = PreferredFullScreenOutputIndex, IsFullScreen = IsFullScreen, PreferredMultisampleCount = PreferredMultisampleCount, SynchronizeWithVerticalRetrace = SynchronizeWithVerticalRetrace, PreferredGraphicsProfile = (GraphicsProfile[])PreferredGraphicsProfile.Clone(), ColorSpace = PreferredColorSpace, RequiredAdapterUid = RequiredAdapterUid, }; // Remap to Srgb backbuffer if necessary if (PreferredColorSpace == ColorSpace.Linear) { // If the device support SRgb and ColorSpace is linear, we use automatically a SRgb backbuffer if (preferredParameters.PreferredBackBufferFormat == PixelFormat.R8G8B8A8_UNorm) { preferredParameters.PreferredBackBufferFormat = PixelFormat.R8G8B8A8_UNorm_SRgb; } else if (preferredParameters.PreferredBackBufferFormat == PixelFormat.B8G8R8A8_UNorm) { preferredParameters.PreferredBackBufferFormat = PixelFormat.B8G8R8A8_UNorm_SRgb; } } else { // If we are looking for gamma and the backbuffer format is SRgb, switch back to non srgb if (preferredParameters.PreferredBackBufferFormat == PixelFormat.R8G8B8A8_UNorm_SRgb) { preferredParameters.PreferredBackBufferFormat = PixelFormat.R8G8B8A8_UNorm; } else if (preferredParameters.PreferredBackBufferFormat == PixelFormat.B8G8R8A8_UNorm_SRgb) { preferredParameters.PreferredBackBufferFormat = PixelFormat.B8G8R8A8_UNorm; } } // Setup resized value if there is a resize pending if (!IsFullScreen && isBackBufferToResize) { preferredParameters.PreferredBackBufferWidth = resizedBackBufferWidth; preferredParameters.PreferredBackBufferHeight = resizedBackBufferHeight; } var devices = graphicsDeviceFactory.FindBestDevices(preferredParameters); if (devices.Count == 0) { // Nothing was found; first, let's check if graphics profile was actually supported // Note: we don't do this preemptively because in some cases it seems to take lot of time (happened on a test machine, several seconds freeze on ID3D11Device.Release()) GraphicsProfile availableGraphicsProfile; if (!IsPreferredProfileAvailable(preferredParameters.PreferredGraphicsProfile, out availableGraphicsProfile)) { throw new InvalidOperationException($"Graphics profiles [{string.Join(", ", preferredParameters.PreferredGraphicsProfile)}] are not supported by the device. The highest available profile is [{availableGraphicsProfile}]."); } // Otherwise, there was just no screen mode throw new InvalidOperationException("No screen modes found"); } RankDevices(devices); if (devices.Count == 0) { throw new InvalidOperationException("No screen modes found after ranking"); } return(devices[0]); }