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, 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); }
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)); }
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"); } }
public EglDisplay(EglInterface egl, bool supportsSharing, int platformType, IntPtr platformDisplay, int[] attrs) : this(egl, supportsSharing, CreateDisplay(egl, platformType, platformDisplay, attrs)) { }
public EglDisplay(EglInterface egl, bool supportsSharing) : this(egl, supportsSharing, -1, IntPtr.Zero, null) { }
public EglSurface(EglDisplay display, EglContext context, IntPtr surface) : base(surface, true) { _display = display; _context = context; _egl = display.EglInterface; }