Beispiel #1
0
        public GraphicsMode SelectGraphicsMode(ColorFormat color, int depth, int stencil,
                                               int samples, ColorFormat accum, int buffers, bool stereo,
                                               RenderableFlags renderable_flags)
        {
            IntPtr[] configs    = new IntPtr[1];
            int[]    attribList = new int[]
            {
                //Egl.SURFACE_TYPE, Egl.WINDOW_BIT,
                Egl.RENDERABLE_TYPE, (int)renderable_flags,

                Egl.RED_SIZE, color.Red,
                Egl.GREEN_SIZE, color.Green,
                Egl.BLUE_SIZE, color.Blue,
                Egl.ALPHA_SIZE, color.Alpha,

                Egl.DEPTH_SIZE, depth > 0 ? depth : 0,
                Egl.STENCIL_SIZE, stencil > 0 ? stencil : 0,

                Egl.SAMPLE_BUFFERS, samples > 0 ? 1 : 0,
                Egl.SAMPLES, samples > 0 ? samples : 0,

                Egl.NONE,
            };

            // Todo: what if we don't wish to use the default display?
            IntPtr display = Egl.GetDisplay(IntPtr.Zero);
            int    major, minor;

            if (!Egl.Initialize(display, out major, out minor))
            {
                throw new GraphicsModeException(String.Format("Failed to initialize display connection, error {0}", Egl.GetError()));
            }

            int num_configs;

            if (!Egl.ChooseConfig(display, attribList, configs, configs.Length, out num_configs) || num_configs == 0)
            {
                throw new GraphicsModeException(String.Format("Failed to retrieve GraphicsMode, error {0}", Egl.GetError()));
            }

            // See what we really got
            IntPtr active_config = configs[0];
            int    r, g, b, a;

            Egl.GetConfigAttrib(display, active_config, Egl.RED_SIZE, out r);
            Egl.GetConfigAttrib(display, active_config, Egl.GREEN_SIZE, out g);
            Egl.GetConfigAttrib(display, active_config, Egl.BLUE_SIZE, out b);
            Egl.GetConfigAttrib(display, active_config, Egl.ALPHA_SIZE, out a);
            int d, s;

            Egl.GetConfigAttrib(display, active_config, Egl.DEPTH_SIZE, out d);
            Egl.GetConfigAttrib(display, active_config, Egl.STENCIL_SIZE, out s);
            int sample_buffers;

            Egl.GetConfigAttrib(display, active_config, Egl.SAMPLES, out sample_buffers);
            Egl.GetConfigAttrib(display, active_config, Egl.SAMPLES, out samples);

            return(new GraphicsMode(active_config, new ColorFormat(r, g, b, a), d, s, sample_buffers > 0 ? samples : 0, 0, 2, false));
        }
Beispiel #2
0
 public GraphicsMode SelectGraphicsMode(EglWindowInfo window,
                                        GraphicsMode mode, RenderableFlags flags)
 {
     return(SelectGraphicsMode(window,
                               mode.ColorFormat, mode.Depth, mode.Stencil,
                               mode.Samples, mode.AccumulatorFormat, mode.Buffers, mode.Stereo,
                               flags));
 }
 public GraphicsMode SelectGraphicsMode(EglWindowInfo window,
     GraphicsMode mode, RenderableFlags flags)
 {
     return SelectGraphicsMode(window,
         mode.ColorFormat, mode.Depth, mode.Stencil,
         mode.Samples, mode.AccumulatorFormat, mode.Buffers, mode.Stereo,
         flags);
 }
        protected override IntPtr GetStaticAddress(IntPtr function, RenderableFlags renderable)
        {
            if ((renderable & (RenderableFlags.ES2 | RenderableFlags.ES3)) != 0 && ES2 != IntPtr.Zero)
            {
                return(Kernel32.GetProcAddress(ES2, function));
            }

            return(IntPtr.Zero);
        }
Beispiel #5
0
 public GraphicsMode SelectGraphicsMode(EglWindowInfo window,
                                        ColorFormat color, int depth, int stencil,
                                        int samples, ColorFormat accum, int buffers, bool stereo,
                                        RenderableFlags renderableFlags)
 {
     return(SelectGraphicsMode(
                SurfaceType.WINDOW_BIT,
                window.Display,
                color, depth, stencil, samples, accum, buffers, stereo, renderableFlags));
 }
Beispiel #6
0
        int swap_interval = 1; // Default interval is defined as 1 in EGL.

        #endregion

        #region Constructors

        public EglContext(GraphicsMode mode, EglWindowInfo window, IGraphicsContext sharedContext,
                          int major, int minor, GraphicsContextFlags flags)
        {
            if (mode == null)
            {
                throw new ArgumentNullException("mode");
            }
            if (window == null)
            {
                throw new ArgumentNullException("window");
            }

            EglContext shared = (EglContext)sharedContext;

            WindowInfo = window;

            // Select an EGLConfig that matches the desired mode. We cannot use the 'mode'
            // parameter directly, since it may have originated on a different system (e.g. GLX)
            // and it may not support the desired renderer.

            Renderable = RenderableFlags.GL;
            if ((flags & GraphicsContextFlags.Embedded) != 0)
            {
                Renderable = major > 1 ? RenderableFlags.ES2 : RenderableFlags.ES;
            }

            RenderApi api = (Renderable & RenderableFlags.GL) != 0 ? RenderApi.GL : RenderApi.ES;

            Debug.Print("[EGL] Binding {0} rendering API.", api);
            if (!Egl.BindAPI(api))
            {
                Debug.Print("[EGL] Failed to bind rendering API. Error: {0}", Egl.GetError());
            }

            Mode = new EglGraphicsMode().SelectGraphicsMode(window,
                                                            mode.ColorFormat, mode.Depth, mode.Stencil, mode.Samples,
                                                            mode.AccumulatorFormat, mode.Buffers, mode.Stereo,
                                                            Renderable);
            if (!Mode.Index.HasValue)
            {
                throw new GraphicsModeException("Invalid or unsupported GraphicsMode.");
            }
            IntPtr config = Mode.Index.Value;

            if (window.Surface == IntPtr.Zero)
            {
                window.CreateWindowSurface(config);
            }

            int[] attrib_list = new int[] { Egl.CONTEXT_CLIENT_VERSION, major, Egl.NONE };
            HandleAsEGLContext = Egl.CreateContext(window.Display, config, shared != null ? shared.HandleAsEGLContext : IntPtr.Zero, attrib_list);

            MakeCurrent(window);
        }
Beispiel #7
0
 protected override IntPtr GetStaticAddress(IntPtr function, RenderableFlags renderable)
 {
     if ((renderable & RenderableFlags.ES) != 0 && ES1 != IntPtr.Zero)
     {
         return(X11.DL.Symbol(ES1, function));
     }
     else if ((renderable & RenderableFlags.ES2) != 0 && ES2 != IntPtr.Zero)
     {
         return(X11.DL.Symbol(ES2, function));
     }
     return(IntPtr.Zero);
 }
 protected override IntPtr GetStaticAddress(IntPtr function, RenderableFlags renderable)
 {
     if ((renderable & RenderableFlags.ES) != 0 && ES1 != IntPtr.Zero)
     {
         return Windows.Functions.GetProcAddress(ES1, function);
     }
     else if ((renderable & RenderableFlags.ES2) != 0 && ES2 != IntPtr.Zero)
     {
         return Windows.Functions.GetProcAddress(ES2, function);
     }
     return IntPtr.Zero;
 }
 protected override IntPtr GetStaticAddress(IntPtr function, RenderableFlags renderable)
 {
     if ((renderable & RenderableFlags.ES) != 0 && ES1 != IntPtr.Zero)
     {
         return X11.DL.Symbol(ES1, function);
     }
     else if ((renderable & RenderableFlags.ES2) != 0 && ES2 != IntPtr.Zero)
     {
         return X11.DL.Symbol(ES2, function);
     }
     return IntPtr.Zero;
 }
Beispiel #10
0
 protected override IntPtr GetStaticAddress(IntPtr function, RenderableFlags renderable)
 {
     if ((renderable & RenderableFlags.ES) != 0 && ES1 != IntPtr.Zero)
     {
         return(Windows.Functions.GetProcAddress(ES1, function));
     }
     else if ((renderable & RenderableFlags.ES2) != 0 && ES2 != IntPtr.Zero)
     {
         return(Windows.Functions.GetProcAddress(ES2, function));
     }
     return(IntPtr.Zero);
 }
Beispiel #11
0
        public GraphicsMode SelectGraphicsMode(SurfaceType surfaceType,
                                               IntPtr display, ColorFormat color, int depth, int stencil,
                                               int samples, ColorFormat accum, int buffers, bool stereo,
                                               RenderableFlags renderableFlags)
        {
            var configs    = new IntPtr[1];
            var attribList = new[]
            {
                Egl.SURFACE_TYPE, (int)surfaceType,
                Egl.RENDERABLE_TYPE, (int)renderableFlags,

                Egl.RED_SIZE, color.Red,
                Egl.GREEN_SIZE, color.Green,
                Egl.BLUE_SIZE, color.Blue,
                Egl.ALPHA_SIZE, color.Alpha,

                Egl.DEPTH_SIZE, depth > 0 ? depth : 0,
                Egl.STENCIL_SIZE, stencil > 0 ? stencil : 0,

                Egl.SAMPLE_BUFFERS, samples > 0 ? 1 : 0,
                Egl.SAMPLES, samples > 0 ? samples : 0,

                Egl.NONE
            };

            int numConfigs;

            if (!Egl.ChooseConfig(display, attribList, configs, configs.Length, out numConfigs) || numConfigs == 0)
            {
                throw new GraphicsModeException($"Failed to retrieve GraphicsMode, error {Egl.GetError()}");
            }

            // See what we really got
            var activeConfig = configs[0];
            int r, g, b, a;

            Egl.GetConfigAttrib(display, activeConfig, Egl.RED_SIZE, out r);
            Egl.GetConfigAttrib(display, activeConfig, Egl.GREEN_SIZE, out g);
            Egl.GetConfigAttrib(display, activeConfig, Egl.BLUE_SIZE, out b);
            Egl.GetConfigAttrib(display, activeConfig, Egl.ALPHA_SIZE, out a);
            int d, s;

            Egl.GetConfigAttrib(display, activeConfig, Egl.DEPTH_SIZE, out d);
            Egl.GetConfigAttrib(display, activeConfig, Egl.STENCIL_SIZE, out s);
            int sampleBuffers;

            Egl.GetConfigAttrib(display, activeConfig, Egl.SAMPLES, out sampleBuffers);
            Egl.GetConfigAttrib(display, activeConfig, Egl.SAMPLES, out samples);

            return(new GraphicsMode(activeConfig, new ColorFormat(r, g, b, a), d, s, sampleBuffers > 0 ? samples : 0, 0,
                                    2, false));
        }
        public GraphicsMode SelectGraphicsMode(ColorFormat color, int depth, int stencil,
            int samples, ColorFormat accum, int buffers, bool stereo,
            RenderableFlags renderable_flags)
        {
            IntPtr[] configs = new IntPtr[1];
            int[] attribList = new int[] 
            { 
                //Egl.SURFACE_TYPE, Egl.WINDOW_BIT,
                Egl.RENDERABLE_TYPE, (int)renderable_flags,

                Egl.RED_SIZE, color.Red, 
                Egl.GREEN_SIZE, color.Green, 
                Egl.BLUE_SIZE, color.Blue,
                Egl.ALPHA_SIZE, color.Alpha,

                Egl.DEPTH_SIZE, depth > 0 ? depth : 0,
                Egl.STENCIL_SIZE, stencil > 0 ? stencil : 0,

                //Egl.SAMPLE_BUFFERS, samples > 0 ? 1 : 0,
                Egl.SAMPLES, samples > 0 ? samples : 0,

                Egl.NONE,
            };

            // Todo: what if we don't wish to use the default display?
            IntPtr display = Egl.GetDisplay(IntPtr.Zero);
            int major, minor;
            if (!Egl.Initialize(display, out major, out minor))
                throw new GraphicsModeException(String.Format("Failed to initialize display connection, error {0}", Egl.GetError()));

            int num_configs;
            if (!Egl.ChooseConfig(display, attribList, configs, configs.Length, out num_configs) || num_configs == 0)
            {
                throw new GraphicsModeException(String.Format("Failed to retrieve GraphicsMode, error {0}", Egl.GetError()));
            }

            // See what we really got
            IntPtr active_config = configs[0];
            int r, g, b, a;
            Egl.GetConfigAttrib(display, active_config, Egl.RED_SIZE, out r);
            Egl.GetConfigAttrib(display, active_config, Egl.GREEN_SIZE, out g);
            Egl.GetConfigAttrib(display, active_config, Egl.BLUE_SIZE, out b);
            Egl.GetConfigAttrib(display, active_config, Egl.ALPHA_SIZE, out a);
            int d, s;
            Egl.GetConfigAttrib(display, active_config, Egl.DEPTH_SIZE, out d);
            Egl.GetConfigAttrib(display, active_config, Egl.STENCIL_SIZE, out s);
            int sample_buffers;
            Egl.GetConfigAttrib(display, active_config, Egl.SAMPLES, out sample_buffers);
            Egl.GetConfigAttrib(display, active_config, Egl.SAMPLES, out samples);

            return new GraphicsMode(active_config, new ColorFormat(r, g, b, a), d, s, sample_buffers > 0 ? samples : 0, 0, 2, false);
        }
        protected override IntPtr GetStaticAddress(IntPtr function, RenderableFlags renderable)
        {
            if ((renderable & (RenderableFlags.ES2 | RenderableFlags.ES3)) != 0 && ES2 != IntPtr.Zero)
            {
                return(DL.Symbol(ES2, function));
            }

            if ((renderable & RenderableFlags.GL) != 0 && GL != IntPtr.Zero)
            {
                return(DL.Symbol(GL, function));
            }

            return(IntPtr.Zero);
        }
Beispiel #14
0
 public GraphicsMode SelectGraphicsMode(ColorFormat color, int depth, int stencil, int samples, ColorFormat accum, int buffers, bool stereo, RenderableFlags renderable_flags)
 {
     IntPtr[] configs = new IntPtr[1];
       int[] attrib_list = new int[17]
       {
     12352,
     (int) renderable_flags,
     12324,
     color.Red,
     12323,
     color.Green,
     12322,
     color.Blue,
     12321,
     color.Alpha,
     12325,
     depth > 0 ? depth : 0,
     12326,
     stencil > 0 ? stencil : 0,
     12337,
     samples > 0 ? samples : 0,
     12344
       };
       IntPtr display = Egl.GetDisplay(IntPtr.Zero);
       int major;
       int minor;
       if (!Egl.Initialize(display, out major, out minor))
     throw new GraphicsModeException(string.Format("Failed to initialize display connection, error {0}", (object) Egl.GetError()));
       int num_config;
       if (!Egl.ChooseConfig(display, attrib_list, configs, configs.Length, out num_config) || num_config == 0)
     throw new GraphicsModeException(string.Format("Failed to retrieve GraphicsMode, error {0}", (object) Egl.GetError()));
       IntPtr config = configs[0];
       int red;
       Egl.GetConfigAttrib(display, config, 12324, out red);
       int green;
       Egl.GetConfigAttrib(display, config, 12323, out green);
       int blue;
       Egl.GetConfigAttrib(display, config, 12322, out blue);
       int alpha;
       Egl.GetConfigAttrib(display, config, 12321, out alpha);
       int depth1;
       Egl.GetConfigAttrib(display, config, 12325, out depth1);
       int stencil1;
       Egl.GetConfigAttrib(display, config, 12326, out stencil1);
       int num;
       Egl.GetConfigAttrib(display, config, 12337, out num);
       Egl.GetConfigAttrib(display, config, 12337, out samples);
       return new GraphicsMode(new IntPtr?(config), new ColorFormat(red, green, blue, alpha), depth1, stencil1, num > 0 ? samples : 0, (ColorFormat) 0, 2, false);
 }
Beispiel #15
0
        int swap_interval = 1; // Default interval is defined as 1 in EGL.

        #endregion

        #region Constructors

        public EglContext(GraphicsMode mode, EglWindowInfo window, IGraphicsContext sharedContext,
            int major, int minor, GraphicsContextFlags flags)
        {
            if (mode == null)
                throw new ArgumentNullException("mode");
            if (window == null)
                throw new ArgumentNullException("window");

            EglContext shared = (EglContext)sharedContext;

            WindowInfo = window;

            // Select an EGLConfig that matches the desired mode. We cannot use the 'mode'
            // parameter directly, since it may have originated on a different system (e.g. GLX)
            // and it may not support the desired renderer.

            Renderable = RenderableFlags.GL;
            if ((flags & GraphicsContextFlags.Embedded) != 0)
            {
                Renderable = major > 1 ? RenderableFlags.ES2 : RenderableFlags.ES;
            }

            RenderApi api = (Renderable & RenderableFlags.GL) != 0 ? RenderApi.GL : RenderApi.ES;
            Debug.Print("[EGL] Binding {0} rendering API.", api);
            if (!Egl.BindAPI(api))
            {
                Debug.Print("[EGL] Failed to bind rendering API. Error: {0}", Egl.GetError());
            }

            Mode = new EglGraphicsMode().SelectGraphicsMode(window,
                mode.ColorFormat, mode.Depth, mode.Stencil, mode.Samples,
                mode.AccumulatorFormat, mode.Buffers, mode.Stereo,
                Renderable);
            if (!Mode.Index.HasValue)
                throw new GraphicsModeException("Invalid or unsupported GraphicsMode.");
            IntPtr config = Mode.Index.Value;

            if (window.Surface == IntPtr.Zero)
                window.CreateWindowSurface(config);

            int[] attrib_list = new int[] { Egl.CONTEXT_CLIENT_VERSION, major, Egl.NONE };
            HandleAsEGLContext = Egl.CreateContext(window.Display, config, shared != null ? shared.HandleAsEGLContext : IntPtr.Zero, attrib_list);

            MakeCurrent(window);
        }
Beispiel #16
0
        private int swap_interval = 1; // Default interval is defined as 1 in EGL.

        public EglContext(GraphicsMode mode, EglWindowInfo window, IGraphicsContext sharedContext,
                          int major, int minor, GraphicsContextFlags flags)
        {
            if (mode == null)
            {
                throw new ArgumentNullException("mode");
            }
            if (window == null)
            {
                throw new ArgumentNullException("window");
            }

            EglContext shared = GetSharedEglContext(sharedContext);

            WindowInfo = window;

            // Select an EGLConfig that matches the desired mode. We cannot use the 'mode'
            // parameter directly, since it may have originated on a different system (e.g. GLX)
            // and it may not support the desired renderer.

            Renderable = RenderableFlags.GL;
            if ((flags & GraphicsContextFlags.Embedded) != 0)
            {
                switch (major)
                {
                case 3:
                    Renderable = RenderableFlags.ES3;
                    break;

                case 2:
                    Renderable = RenderableFlags.ES2;
                    break;

                default:
                    Renderable = RenderableFlags.ES;
                    break;
                }
            }

            RenderApi api = (Renderable & RenderableFlags.GL) != 0 ? RenderApi.GL : RenderApi.ES;

            Debug.Print("[EGL] Binding {0} rendering API.", api);
            if (!Egl.BindAPI(api))
            {
                Debug.Print("[EGL] Failed to bind rendering API. Error: {0}", Egl.GetError());
            }

            bool offscreen = (flags & GraphicsContextFlags.Offscreen) != 0;

            SurfaceType surfaceType = offscreen
                ? SurfaceType.PBUFFER_BIT
                : SurfaceType.WINDOW_BIT;

            Mode = new EglGraphicsMode().SelectGraphicsMode(surfaceType,
                                                            window.Display, mode.ColorFormat, mode.Depth, mode.Stencil,
                                                            mode.Samples, mode.AccumulatorFormat, mode.Buffers, mode.Stereo,
                                                            Renderable);

            if (!Mode.Index.HasValue)
            {
                throw new GraphicsModeException("Invalid or unsupported GraphicsMode.");
            }
            IntPtr config = Mode.Index.Value;

            if (window.Surface == IntPtr.Zero)
            {
                if (!offscreen)
                {
                    window.CreateWindowSurface(config);
                }
                else
                {
                    window.CreatePbufferSurface(config);
                }
            }

            int[] attribList   = { Egl.CONTEXT_CLIENT_VERSION, major, Egl.NONE };
            var   shareContext = shared?.HandleAsEGLContext ?? IntPtr.Zero;

            HandleAsEGLContext = Egl.CreateContext(window.Display, config, shareContext, attribList);

            GraphicsContextFlags = flags;
        }
Beispiel #17
0
 protected abstract IntPtr GetStaticAddress(IntPtr function, RenderableFlags renderable);
Beispiel #18
0
 protected override IntPtr GetStaticAddress(IntPtr function, RenderableFlags renderable)
 {
     return(IntPtr.Zero);
 }
Beispiel #19
0
 protected abstract IntPtr GetStaticAddress(IntPtr function, RenderableFlags renderable);
Beispiel #20
0
        public GraphicsMode SelectGraphicsMode(ColorFormat color, int depth, int stencil, int samples, ColorFormat accum, int buffers, bool stereo, RenderableFlags renderable_flags)
        {
            IntPtr[] configs     = new IntPtr[1];
            int[]    attrib_list = new int[17]
            {
                12352,
                (int)renderable_flags,
                12324,
                color.Red,
                12323,
                color.Green,
                12322,
                color.Blue,
                12321,
                color.Alpha,
                12325,
                depth > 0 ? depth : 0,
                12326,
                stencil > 0 ? stencil : 0,
                12337,
                samples > 0 ? samples : 0,
                12344
            };
            IntPtr display = Egl.GetDisplay(IntPtr.Zero);
            int    major;
            int    minor;

            if (!Egl.Initialize(display, out major, out minor))
            {
                throw new GraphicsModeException(string.Format("Failed to initialize display connection, error {0}", (object)Egl.GetError()));
            }
            int num_config;

            if (!Egl.ChooseConfig(display, attrib_list, configs, configs.Length, out num_config) || num_config == 0)
            {
                throw new GraphicsModeException(string.Format("Failed to retrieve GraphicsMode, error {0}", (object)Egl.GetError()));
            }
            IntPtr config = configs[0];
            int    red;

            Egl.GetConfigAttrib(display, config, 12324, out red);
            int green;

            Egl.GetConfigAttrib(display, config, 12323, out green);
            int blue;

            Egl.GetConfigAttrib(display, config, 12322, out blue);
            int alpha;

            Egl.GetConfigAttrib(display, config, 12321, out alpha);
            int depth1;

            Egl.GetConfigAttrib(display, config, 12325, out depth1);
            int stencil1;

            Egl.GetConfigAttrib(display, config, 12326, out stencil1);
            int num;

            Egl.GetConfigAttrib(display, config, 12337, out num);
            Egl.GetConfigAttrib(display, config, 12337, out samples);
            return(new GraphicsMode(new IntPtr?(config), new ColorFormat(red, green, blue, alpha), depth1, stencil1, num > 0 ? samples : 0, (ColorFormat)0, 2, false));
        }
Beispiel #21
0
        public GraphicsMode SelectGraphicsMode(SurfaceType surface_type,
                                               IntPtr display, ColorFormat color, int depth, int stencil,
                                               int samples, ColorFormat accum, int buffers, bool stereo,
                                               RenderableFlags renderable_flags, bool fullscreen)
        {
            IntPtr[] configs    = new IntPtr[1];
            int[]    attribList = new int[]
            {
                Egl.SURFACE_TYPE, (int)surface_type,
                Egl.RENDERABLE_TYPE, (int)renderable_flags,

                Egl.RED_SIZE, color.Red,
                Egl.GREEN_SIZE, color.Green,
                Egl.BLUE_SIZE, color.Blue,
                Egl.ALPHA_SIZE, color.Alpha,

                Egl.DEPTH_SIZE, depth > 0 ? depth : 0,
                Egl.STENCIL_SIZE, stencil > 0 ? stencil : 0,

                Egl.SAMPLE_BUFFERS, samples > 0 ? 1 : 0,
                Egl.SAMPLES, samples > 0 ? samples : 0,

                Egl.FULLSCREEN_ANGLE, fullscreen ? Egl.TRUE : Egl.FALSE,

                Egl.NONE,
            };

            int num_configs;

            if (!Egl.ChooseConfig(display, attribList, configs, configs.Length, out num_configs))
            {
                throw new GraphicsModeException(String.Format("Failed to retrieve GraphicsMode, error {0}", Egl.GetError()));
            }

            if (num_configs == 0)
            {
                if (depth > 0)
                {
                    return(SelectGraphicsMode(surface_type, display, color, 0, stencil, samples, accum, buffers, stereo, renderable_flags, fullscreen));
                }

                throw new GraphicsModeException(String.Format("Failed to retrieve GraphicsMode, no fitting configurations, error {0}", Egl.GetError()));
            }

            // See what we really got
            IntPtr active_config = configs[0];
            int    r, g, b, a;

            Egl.GetConfigAttrib(display, active_config, Egl.RED_SIZE, out r);
            Egl.GetConfigAttrib(display, active_config, Egl.GREEN_SIZE, out g);
            Egl.GetConfigAttrib(display, active_config, Egl.BLUE_SIZE, out b);
            Egl.GetConfigAttrib(display, active_config, Egl.ALPHA_SIZE, out a);
            int d, s;

            Egl.GetConfigAttrib(display, active_config, Egl.DEPTH_SIZE, out d);
            Egl.GetConfigAttrib(display, active_config, Egl.STENCIL_SIZE, out s);
            int sample_buffers;

            Egl.GetConfigAttrib(display, active_config, Egl.SAMPLES, out sample_buffers);
            Egl.GetConfigAttrib(display, active_config, Egl.SAMPLES, out samples);

            return(new GraphicsMode(active_config, new ColorFormat(r, g, b, a), d, s, sample_buffers > 0 ? samples : 0, 0, 2, false));
        }