// Todo: Add custom visual selection algorithm, instead of ChooseFBConfig/ChooseVisual.
// It seems the Choose* methods do not take multisampling into account (at least on some
// drivers).
public GraphicsMode SelectGraphicsMode(GraphicsMode desired_mode, out IntPtr visual, out IntPtr fbconfig)
{
GraphicsMode gfx;
var mode = new GraphicsMode(desired_mode);
visual = IntPtr.Zero;
fbconfig = IntPtr.Zero;
var display = API.DefaultDisplay;
do
{
// Try to select a visual using Glx.ChooseFBConfig and Glx.GetVisualFromFBConfig.
// This is only supported on GLX 1.3 - if it fails, fall back to Glx.ChooseVisual.
fbconfig = SelectFBConfig(mode);
if (fbconfig != IntPtr.Zero)
{
visual = Glx.GetVisualFromFBConfig(display, fbconfig);
}
if (visual == IntPtr.Zero)
{
visual = SelectVisual(mode);
}
if (visual == IntPtr.Zero)
{
// Relax parameters and retry
if (!Utilities.RelaxGraphicsMode(ref mode))
{
throw new GraphicsModeException("Requested GraphicsMode not available.");
}
}
} while (visual == IntPtr.Zero);
var info = (XVisualInfo)Marshal.PtrToStructure(visual, typeof(XVisualInfo));
gfx = CreateGraphicsMode(display, ref info);
return(gfx);
}