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 IDisposable MakeCurrent(EglSurface surface) { Monitor.Enter(_lock); var success = false; try { var old = new RestoreContext(_egl, _disp.Handle, _lock); var surf = surface ?? OffscreenSurface; _egl.MakeCurrent(_disp.Handle, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); if (!_egl.MakeCurrent(_disp.Handle, surf?.DangerousGetHandle() ?? IntPtr.Zero, surf?.DangerousGetHandle() ?? IntPtr.Zero, Context)) { throw OpenGlException.GetFormattedException("eglMakeCurrent", _egl); } success = true; return(old); } finally { if (!success) { Monitor.Enter(_lock); } } }
public EglContext CreateContext(IGlContext share) { if (share != null && !SupportsSharing) { throw new NotSupportedException("Context sharing is not supported by this display"); } if ((_surfaceType | EGL_PBUFFER_BIT) == 0) { throw new InvalidOperationException("Platform doesn't support PBUFFER surfaces"); } var shareCtx = (EglContext)share; var ctx = _egl.CreateContext(_display, _config, shareCtx?.Context ?? IntPtr.Zero, _contextAttributes); if (ctx == IntPtr.Zero) { throw OpenGlException.GetFormattedException("eglCreateContext", _egl); } var surf = _egl.CreatePBufferSurface(_display, _config, new[] { EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE }); if (surf == IntPtr.Zero) { throw OpenGlException.GetFormattedException("eglCreatePBufferSurface", _egl); } var rv = new EglContext(this, _egl, shareCtx, ctx, context => new EglSurface(this, context, surf), _version, _sampleCount, _stencilSize); return(rv); }
public EglSurface CreateWindowSurface(IntPtr window) { using (PrimaryContext.MakeCurrent()) { var s = Display.EglInterface.CreateWindowSurface(Display.Handle, Display.Config, window, new[] { EGL_NONE, EGL_NONE }); if (s == IntPtr.Zero) { throw OpenGlException.GetFormattedException("eglCreateWindowSurface", Display.EglInterface); } return(new EglSurface(Display, PrimaryEglContext, s)); } }
public EglSurface CreatePBufferFromClientBuffer(int bufferType, IntPtr handle, int[] attribs) { using (PrimaryContext.MakeCurrent()) { var s = Display.EglInterface.CreatePbufferFromClientBuffer(Display.Handle, bufferType, handle, Display.Config, attribs); if (s == IntPtr.Zero) { throw OpenGlException.GetFormattedException("eglCreatePbufferFromClientBuffer", Display.EglInterface); } return(new EglSurface(Display, PrimaryEglContext, s)); } }
public EglContext CreateContext(EglContext share, EglSurface offscreenSurface) { if (share != null && !SupportsSharing) { throw new NotSupportedException("Context sharing is not supported by this display"); } var ctx = _egl.CreateContext(_display, _config, share?.Context ?? IntPtr.Zero, _contextAttributes); if (ctx == IntPtr.Zero) { throw OpenGlException.GetFormattedException("eglCreateContext", _egl); } var rv = new EglContext(this, _egl, share, ctx, _ => offscreenSurface, _version, _sampleCount, _stencilSize); rv.MakeCurrent(null); return(rv); }
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"); } }