public EglContext(EglDisplay display, EglInterface egl, IntPtr ctx, IntPtr offscreenSurface) { _disp = display; _egl = egl; Context = ctx; OffscreenSurface = offscreenSurface; }
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); }
public RestoreContext(EglInterface egl, IntPtr defDisplay) { _egl = egl; _display = _egl.GetCurrentDisplay(); if (_display == IntPtr.Zero) { _display = defDisplay; } _context = _egl.GetCurrentContext(); _read = _egl.GetCurrentSurface(EGL_READ); _draw = _egl.GetCurrentSurface(EGL_DRAW); }
public EglContext(EglDisplay display, EglInterface egl, IntPtr ctx, EglSurface offscreenSurface, GlVersion version, int sampleCount, int stencilSize) { _disp = display; _egl = egl; Context = ctx; OffscreenSurface = offscreenSurface; Version = version; SampleCount = sampleCount; StencilSize = stencilSize; using (MakeCurrent()) GlInterface = GlInterface.FromNativeUtf8GetProcAddress(version, b => _egl.GetProcAddress(b)); }
public EglSurface(EglDisplay display, EglInterface egl, IntPtr surface) : base(surface, true) { _display = display; _egl = egl; }
public static OpenGlException GetFormattedException(string funcName, EglInterface egl) { return(GetFormattedException(typeof(EglErrors), funcName, egl.GetError())); }
public EglDisplay(EglInterface egl, int platformType, IntPtr platformDisplay, int[] attrs) { _egl = egl; if (platformType == -1 && platformDisplay == IntPtr.Zero) { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { if (_egl.GetPlatformDisplayEXT == null) { throw new OpenGlException("eglGetPlatformDisplayEXT is not supported by libegl.dll"); } var allowedApis = AvaloniaLocator.Current.GetService <AngleOptions>()?.AllowedPlatformApis ?? new List <AngleOptions.PlatformApi> { AngleOptions.PlatformApi.DirectX9 }; foreach (var platformApi in allowedApis) { int dapi; if (platformApi == AngleOptions.PlatformApi.DirectX9) { dapi = EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE; } else if (platformApi == AngleOptions.PlatformApi.DirectX11) { dapi = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE; } else { continue; } _display = _egl.GetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, IntPtr.Zero, new[] { EGL_PLATFORM_ANGLE_TYPE_ANGLE, dapi, EGL_NONE }); if (_display != IntPtr.Zero) { _angleApi = platformApi; break; } } if (_display == IntPtr.Zero) { throw new OpenGlException("Unable to create ANGLE display"); } } 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); } if (!_egl.Initialize(_display, out var major, out var minor)) { throw OpenGlException.GetFormattedException("eglInitialize", _egl); } foreach (var cfg in new[] { new { Attributes = new[] { EGL_NONE }, Api = EGL_OPENGL_API, RenderableTypeBit = EGL_OPENGL_BIT, Type = GlDisplayType.OpenGL2 }, new { Attributes = new[] { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }, Api = EGL_OPENGL_ES_API, RenderableTypeBit = EGL_OPENGL_ES2_BIT, Type = GlDisplayType.OpenGLES2 } }) { 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; Type = cfg.Type; } } } } if (_contextAttributes == null) { throw new OpenGlException("No suitable EGL config was found"); } GlInterface = GlInterface.FromNativeUtf8GetProcAddress(b => _egl.GetProcAddress(b)); }
public EglDisplay(EglInterface egl) : this(egl, -1, IntPtr.Zero, null) { }
public EglDisplay(EglInterface egl) { _egl = egl; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && _egl.GetPlatformDisplayEXT != null) { foreach (var dapi in new[] { EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE }) { _display = _egl.GetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, IntPtr.Zero, new[] { EGL_PLATFORM_ANGLE_TYPE_ANGLE, dapi, EGL_NONE }); if (_display != IntPtr.Zero) { break; } } } if (_display == IntPtr.Zero) { _display = _egl.GetDisplay(IntPtr.Zero); } if (_display == IntPtr.Zero) { throw OpenGlException.GetFormattedException("eglGetDisplay", _egl); } if (!_egl.Initialize(_display, out var major, out var minor)) { throw OpenGlException.GetFormattedException("eglInitialize", _egl); } foreach (var cfg in new[] { new { Attributes = new[] { EGL_NONE }, Api = EGL_OPENGL_API, RenderableTypeBit = EGL_OPENGL_BIT, Type = GlDisplayType.OpenGL2 }, new { Attributes = new[] { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }, Api = EGL_OPENGL_ES_API, RenderableTypeBit = EGL_OPENGL_ES2_BIT, Type = GlDisplayType.OpenGLES2 } }) { if (!_egl.BindApi(cfg.Api)) { continue; } var attribs = new[] { EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_RENDERABLE_TYPE, cfg.RenderableTypeBit, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_STENCIL_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_NONE }; if (!_egl.ChooseConfig(_display, attribs, out _config, 1, out int numConfigs)) { continue; } if (numConfigs == 0) { continue; } _contextAttributes = cfg.Attributes; Type = cfg.Type; } if (_contextAttributes == null) { throw new OpenGlException("No suitable EGL config was found"); } GlInterface = new GlInterface((proc, optional) => { using (var u = new Utf8Buffer(proc)) { var rv = _egl.GetProcAddress(u); if (rv == IntPtr.Zero && !optional) { throw new OpenGlException("Missing function " + proc); } return(rv); } }); }
public EglDisplay(EglInterface egl, IntPtr display) { _egl = egl; _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"); } }
public EglDisplay(EglInterface egl, int platformType, IntPtr platformDisplay, int[] attrs) : this(egl, CreateDisplay(egl, platformType, platformDisplay, attrs)) { }
public EglDisplay(EglInterface egl, IntPtr display) { _egl = egl; _display = display; if (_display == IntPtr.Zero) { throw new ArgumentException(); } if (!_egl.Initialize(_display, out var major, out var minor)) { throw OpenGlException.GetFormattedException("eglInitialize", _egl); } foreach (var cfg in new[] { new { Attributes = new[] { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }, Api = EGL_OPENGL_ES_API, RenderableTypeBit = EGL_OPENGL_ES2_BIT, Version = new GlVersion(GlProfileType.OpenGLES, 2, 0) } }) { 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"); } }