Exemplo n.º 1
0
        static IntPtr CreateDisplay(EglInterface egl, int platformType, IntPtr platformDisplay, int[] attrs)
        {
            var display = IntPtr.Zero;

            if (platformType == -1 && platformDisplay == IntPtr.Zero)
            {
                if (display == IntPtr.Zero)
                {
                    display = egl.GetDisplay(IntPtr.Zero);
                }
            }
            else
            {
                if (egl.GetPlatformDisplayEXT == null)
                {
                    throw new OpenGlException("eglGetPlatformDisplayEXT is not supported by libegl");
                }
                display = egl.GetPlatformDisplayEXT(platformType, platformDisplay, attrs);
            }

            if (display == IntPtr.Zero)
            {
                throw OpenGlException.GetFormattedException("eglGetDisplay", egl);
            }
            return(display);
        }
Exemplo n.º 2
0
 public RestoreContext(EglInterface egl, IntPtr defDisplay, object l)
 {
     _egl     = egl;
     _l       = l;
     _display = _egl.GetCurrentDisplay();
     if (_display == IntPtr.Zero)
     {
         _display = defDisplay;
     }
     _context = _egl.GetCurrentContext();
     _read    = _egl.GetCurrentSurface(EGL_READ);
     _draw    = _egl.GetCurrentSurface(EGL_DRAW);
 }
Exemplo n.º 3
0
 public EglContext(EglDisplay display, EglInterface egl, EglContext sharedWith, IntPtr ctx, Func <EglContext, EglSurface> offscreenSurface,
                   GlVersion version, int sampleCount, int stencilSize)
 {
     _disp            = display;
     _egl             = egl;
     _sharedWith      = sharedWith;
     Context          = ctx;
     OffscreenSurface = offscreenSurface(this);
     Version          = version;
     SampleCount      = sampleCount;
     StencilSize      = stencilSize;
     using (MakeCurrent())
         GlInterface = GlInterface.FromNativeUtf8GetProcAddress(version, b => _egl.GetProcAddress(b));
 }
Exemplo n.º 4
0
        public EglDisplay(EglInterface egl, bool supportsSharing, IntPtr display)
        {
            _egl            = egl;
            SupportsSharing = supportsSharing;
            _display        = display;
            if (_display == IntPtr.Zero)
            {
                throw new ArgumentException();
            }


            if (!_egl.Initialize(_display, out var major, out var minor))
            {
                throw OpenGlException.GetFormattedException("eglInitialize", _egl);
            }

            var glProfiles = AvaloniaLocator.Current.GetService <AngleOptions>()?.GlProfiles
                             ?? new[]
            {
                new GlVersion(GlProfileType.OpenGLES, 3, 0),
                new GlVersion(GlProfileType.OpenGLES, 2, 0)
            };

            var cfgs = glProfiles.Select(x =>
            {
                var typeBit = EGL_OPENGL_ES3_BIT;

                switch (x.Major)
                {
                case 2:
                    typeBit = EGL_OPENGL_ES2_BIT;
                    break;

                case 1:
                    typeBit = EGL_OPENGL_ES_BIT;
                    break;
                }

                return(new
                {
                    Attributes = new[]
                    {
                        EGL_CONTEXT_MAJOR_VERSION, x.Major,
                        EGL_CONTEXT_MINOR_VERSION, x.Minor,
                        EGL_NONE
                    },
                    Api = EGL_OPENGL_ES_API,
                    RenderableTypeBit = typeBit,
                    Version = x
                });
            });

            foreach (var cfg in cfgs)
            {
                if (!_egl.BindApi(cfg.Api))
                {
                    continue;
                }
                foreach (var surfaceType in new[] { EGL_PBUFFER_BIT | EGL_WINDOW_BIT, EGL_WINDOW_BIT })
                {
                    foreach (var stencilSize in new[] { 8, 1, 0 })
                    {
                        foreach (var depthSize in new [] { 8, 1, 0 })
                        {
                            var attribs = new[]
                            {
                                EGL_SURFACE_TYPE, surfaceType,
                                EGL_RENDERABLE_TYPE, cfg.RenderableTypeBit,
                                EGL_RED_SIZE, 8,
                                EGL_GREEN_SIZE, 8,
                                EGL_BLUE_SIZE, 8,
                                EGL_ALPHA_SIZE, 8,
                                EGL_STENCIL_SIZE, stencilSize,
                                EGL_DEPTH_SIZE, depthSize,
                                EGL_NONE
                            };
                            if (!_egl.ChooseConfig(_display, attribs, out _config, 1, out int numConfigs))
                            {
                                continue;
                            }
                            if (numConfigs == 0)
                            {
                                continue;
                            }
                            _contextAttributes = cfg.Attributes;
                            _surfaceType       = surfaceType;
                            _version           = cfg.Version;
                            _egl.GetConfigAttrib(_display, _config, EGL_SAMPLES, out _sampleCount);
                            _egl.GetConfigAttrib(_display, _config, EGL_STENCIL_SIZE, out _stencilSize);
                            goto Found;
                        }
                    }
                }
            }
Found:
            if (_contextAttributes == null)
            {
                throw new OpenGlException("No suitable EGL config was found");
            }
        }
Exemplo n.º 5
0
 public EglDisplay(EglInterface egl, bool supportsSharing, int platformType, IntPtr platformDisplay, int[] attrs)
     : this(egl, supportsSharing, CreateDisplay(egl, platformType, platformDisplay, attrs))
 {
 }
Exemplo n.º 6
0
 public EglDisplay(EglInterface egl, bool supportsSharing) : this(egl, supportsSharing, -1, IntPtr.Zero, null)
 {
 }
Exemplo n.º 7
0
 public EglSurface(EglDisplay display, EglContext context, IntPtr surface)  : base(surface, true)
 {
     _display = display;
     _context = context;
     _egl     = display.EglInterface;
 }