GetVisualFromFBConfig() private method

private GetVisualFromFBConfig ( IntPtr dpy, IntPtr fbconfig ) : IntPtr
dpy System.IntPtr
fbconfig System.IntPtr
return System.IntPtr
        // 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);
        }
Example #2
0
        private unsafe IntPtr SelectVisualUsingFBConfig(ColorFormat color, int depth, int stencil, int samples, ColorFormat accum, int buffers, bool stereo)
        {
            List <int> list = new List <int>();
            IntPtr     num1 = IntPtr.Zero;

            if (color.BitsPerPixel > 0)
            {
                if (!color.IsIndexed)
                {
                    list.Add(4);
                    list.Add(1);
                }
                list.Add(8);
                list.Add(color.Red);
                list.Add(9);
                list.Add(color.Green);
                list.Add(10);
                list.Add(color.Blue);
                list.Add(11);
                list.Add(color.Alpha);
            }
            if (depth > 0)
            {
                list.Add(12);
                list.Add(depth);
            }
            if (buffers > 1)
            {
                list.Add(5);
                list.Add(1);
            }
            if (stencil > 1)
            {
                list.Add(13);
                list.Add(stencil);
            }
            if (accum.BitsPerPixel > 0)
            {
                list.Add(17);
                list.Add(accum.Alpha);
                list.Add(16);
                list.Add(accum.Blue);
                list.Add(15);
                list.Add(accum.Green);
                list.Add(14);
                list.Add(accum.Red);
            }
            if (samples > 0)
            {
                list.Add(100000);
                list.Add(1);
                list.Add(100001);
                list.Add(samples);
            }
            if (stereo)
            {
                list.Add(6);
                list.Add(1);
            }
            list.Add(0);
            IntPtr defaultDisplay = API.DefaultDisplay;

            using (new XLock(defaultDisplay))
            {
                try
                {
                    int num2 = Functions.XDefaultScreen(defaultDisplay);
                    Functions.XRootWindow(defaultDisplay, num2);
                    int     fbount;
                    IntPtr *numPtr = Glx.ChooseFBConfig(defaultDisplay, num2, list.ToArray(), out fbount);
                    if (fbount > 0)
                    {
                        if ((IntPtr)numPtr != IntPtr.Zero)
                        {
                            num1 = Glx.GetVisualFromFBConfig(defaultDisplay, *numPtr);
                            Functions.XFree((IntPtr)((void *)numPtr));
                        }
                    }
                }
                catch (EntryPointNotFoundException ex)
                {
                    return(IntPtr.Zero);
                }
            }
            return(num1);
        }
Example #3
0
        // See http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.opengl/doc/openglrf/glXChooseFBConfig.htm
        // for the attribute declarations. Note that the attributes are different than those used in Glx.ChooseVisual.
        IntPtr SelectVisualUsingFBConfig(ColorFormat color, int depth, int stencil, int samples, ColorFormat accum,
                                         int buffers, bool stereo)
        {
            List <int> visualAttributes = new List <int>();
            IntPtr     visual           = IntPtr.Zero;

            Debug.Print("Bits per pixel: {0}", color.BitsPerPixel);

            if (color.BitsPerPixel > 0)
            {
                if (!color.IsIndexed)
                {
                    visualAttributes.Add((int)GLXAttribute.RGBA);
                    visualAttributes.Add(1);
                }
                visualAttributes.Add((int)GLXAttribute.RED_SIZE);
                visualAttributes.Add(color.Red);
                visualAttributes.Add((int)GLXAttribute.GREEN_SIZE);
                visualAttributes.Add(color.Green);
                visualAttributes.Add((int)GLXAttribute.BLUE_SIZE);
                visualAttributes.Add(color.Blue);
                visualAttributes.Add((int)GLXAttribute.ALPHA_SIZE);
                visualAttributes.Add(color.Alpha);
            }

            Debug.Print("Depth: {0}", depth);

            if (depth > 0)
            {
                visualAttributes.Add((int)GLXAttribute.DEPTH_SIZE);
                visualAttributes.Add(depth);
            }

            if (buffers > 1)
            {
                visualAttributes.Add((int)GLXAttribute.DOUBLEBUFFER);
                visualAttributes.Add(1);
            }

            if (stencil > 1)
            {
                visualAttributes.Add((int)GLXAttribute.STENCIL_SIZE);
                visualAttributes.Add(stencil);
            }

            if (accum.BitsPerPixel > 0)
            {
                visualAttributes.Add((int)GLXAttribute.ACCUM_ALPHA_SIZE);
                visualAttributes.Add(accum.Alpha);
                visualAttributes.Add((int)GLXAttribute.ACCUM_BLUE_SIZE);
                visualAttributes.Add(accum.Blue);
                visualAttributes.Add((int)GLXAttribute.ACCUM_GREEN_SIZE);
                visualAttributes.Add(accum.Green);
                visualAttributes.Add((int)GLXAttribute.ACCUM_RED_SIZE);
                visualAttributes.Add(accum.Red);
            }

            if (samples > 0)
            {
                visualAttributes.Add((int)GLXAttribute.SAMPLE_BUFFERS);
                visualAttributes.Add(1);
                visualAttributes.Add((int)GLXAttribute.SAMPLES);
                visualAttributes.Add(samples);
            }

            if (stereo)
            {
                visualAttributes.Add((int)GLXAttribute.STEREO);
                visualAttributes.Add(1);
            }

            visualAttributes.Add(0);

            // Select a visual that matches the parameters set by the user.
            IntPtr display = API.DefaultDisplay;

            using (new XLock(display))
            {
                try
                {
                    int    screen = Functions.XDefaultScreen(display);
                    IntPtr root   = Functions.XRootWindow(display, screen);
                    Debug.Print("Display: {0}, Screen: {1}, RootWindow: {2}", display, screen, root);

                    unsafe
                    {
                        Debug.Print("Getting FB config.");
                        int fbcount;
                        // Note that ChooseFBConfig returns an array of GLXFBConfig opaque structures (i.e. mapped to IntPtrs).
                        IntPtr *fbconfigs = Glx.ChooseFBConfig(display, screen, visualAttributes.ToArray(), out fbcount);
                        if (fbcount > 0 && fbconfigs != null)
                        {
                            // We want to use the first GLXFBConfig from the fbconfigs array (the first one is the best match).
                            visual = Glx.GetVisualFromFBConfig(display, *fbconfigs);
                            Functions.XFree((IntPtr)fbconfigs);
                        }
                    }
                }
                catch (EntryPointNotFoundException)
                {
                    Debug.Print("Function glXChooseFBConfig not supported.");
                    return(IntPtr.Zero);
                }
            }

            return(visual);
        }