From c01c7c937838265fc8031934c1bca7703ec9952b Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 15 Sep 2020 02:50:27 -0700 Subject: [PATCH 1/4] opengl es 3.1, 3.0 and 2.0 --- src/Avalonia.OpenGL/EglDisplay.cs | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.OpenGL/EglDisplay.cs b/src/Avalonia.OpenGL/EglDisplay.cs index 7b194e4346..ca7e9b66c3 100644 --- a/src/Avalonia.OpenGL/EglDisplay.cs +++ b/src/Avalonia.OpenGL/EglDisplay.cs @@ -67,13 +67,38 @@ namespace Avalonia.OpenGL { Attributes = new[] { - EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_CONTEXT_MAJOR_VERSION, 3, + EGL_CONTEXT_MINOR_VERSION, 1, + EGL_NONE + }, + Api = EGL_OPENGL_ES_API, + RenderableTypeBit = EGL_OPENGL_ES3_BIT, + Version = new GlVersion(GlProfileType.OpenGLES, 3, 1) + }, + new + { + Attributes = new[] + { + EGL_CONTEXT_MAJOR_VERSION, 3, + EGL_CONTEXT_MINOR_VERSION, 0, + EGL_NONE + }, + Api = EGL_OPENGL_ES_API, + RenderableTypeBit = EGL_OPENGL_ES3_BIT, + Version = new GlVersion(GlProfileType.OpenGLES, 3, 0) + }, + new + { + Attributes = new[] + { + EGL_CONTEXT_MAJOR_VERSION, 2, + EGL_CONTEXT_MINOR_VERSION, 0, EGL_NONE }, Api = EGL_OPENGL_ES_API, RenderableTypeBit = EGL_OPENGL_ES2_BIT, Version = new GlVersion(GlProfileType.OpenGLES, 2, 0) - } + }, }) { if (!_egl.BindApi(cfg.Api)) From a6d83cd32a8e373b7b00f58b18b2947f135da3fa Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 15 Sep 2020 06:12:47 -0700 Subject: [PATCH 2/4] support any gles version with angle using angle options. --- src/Avalonia.OpenGL/AngleOptions.cs | 8 +++ src/Avalonia.OpenGL/EglDisplay.cs | 63 +++++++++++----------- src/Avalonia.X11/Glx/GlxDisplay.cs | 2 +- src/Avalonia.X11/Glx/GlxPlatformFeature.cs | 4 +- src/Avalonia.X11/X11Platform.cs | 4 +- 5 files changed, 45 insertions(+), 36 deletions(-) diff --git a/src/Avalonia.OpenGL/AngleOptions.cs b/src/Avalonia.OpenGL/AngleOptions.cs index 84744288ed..462bd56cbe 100644 --- a/src/Avalonia.OpenGL/AngleOptions.cs +++ b/src/Avalonia.OpenGL/AngleOptions.cs @@ -10,6 +10,14 @@ namespace Avalonia.OpenGL DirectX11 } + public IList GlProfiles { get; set; } = new List + { + new GlVersion(GlProfileType.OpenGLES, 3, 2), + new GlVersion(GlProfileType.OpenGLES, 3, 1), + new GlVersion(GlProfileType.OpenGLES, 3, 0), + new GlVersion(GlProfileType.OpenGLES, 2, 0) + }; + public IList AllowedPlatformApis { get; set; } = null; } } diff --git a/src/Avalonia.OpenGL/EglDisplay.cs b/src/Avalonia.OpenGL/EglDisplay.cs index ca7e9b66c3..9edcaf2bc0 100644 --- a/src/Avalonia.OpenGL/EglDisplay.cs +++ b/src/Avalonia.OpenGL/EglDisplay.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Runtime.InteropServices; using Avalonia.Platform.Interop; using static Avalonia.OpenGL.EglConsts; @@ -61,45 +62,45 @@ namespace Avalonia.OpenGL if (!_egl.Initialize(_display, out var major, out var minor)) throw OpenGlException.GetFormattedException("eglInitialize", _egl); - foreach (var cfg in new[] + var glProfiles = AvaloniaLocator.Current.GetService()?.GlProfiles + ?? new[] + { + new GlVersion(GlProfileType.OpenGLES, 3, 2), + new GlVersion(GlProfileType.OpenGLES, 3, 1), + new GlVersion(GlProfileType.OpenGLES, 3, 0), + new GlVersion(GlProfileType.OpenGLES, 2, 0) + }; + + var cfgs = glProfiles.Select(x => { - new - { - Attributes = new[] - { - EGL_CONTEXT_MAJOR_VERSION, 3, - EGL_CONTEXT_MINOR_VERSION, 1, - EGL_NONE - }, - Api = EGL_OPENGL_ES_API, - RenderableTypeBit = EGL_OPENGL_ES3_BIT, - Version = new GlVersion(GlProfileType.OpenGLES, 3, 1) - }, - new + var typeBit = EGL_OPENGL_ES3_BIT; + + switch (x.Major) { - Attributes = new[] - { - EGL_CONTEXT_MAJOR_VERSION, 3, - EGL_CONTEXT_MINOR_VERSION, 0, - EGL_NONE - }, - Api = EGL_OPENGL_ES_API, - RenderableTypeBit = EGL_OPENGL_ES3_BIT, - Version = new GlVersion(GlProfileType.OpenGLES, 3, 0) - }, - new + case 2: + typeBit = EGL_OPENGL_ES2_BIT; + break; + + case 1: + typeBit = EGL_OPENGL_ES_BIT; + break; + } + + return new { Attributes = new[] { - EGL_CONTEXT_MAJOR_VERSION, 2, - EGL_CONTEXT_MINOR_VERSION, 0, + EGL_CONTEXT_MAJOR_VERSION, x.Major, + EGL_CONTEXT_MINOR_VERSION, x.Minor, EGL_NONE }, Api = EGL_OPENGL_ES_API, - RenderableTypeBit = EGL_OPENGL_ES2_BIT, - Version = new GlVersion(GlProfileType.OpenGLES, 2, 0) - }, - }) + RenderableTypeBit = typeBit, + Version = x + }; + }); + + foreach (var cfg in cfgs) { if (!_egl.BindApi(cfg.Api)) continue; diff --git a/src/Avalonia.X11/Glx/GlxDisplay.cs b/src/Avalonia.X11/Glx/GlxDisplay.cs index 903d6b570b..b82895d12c 100644 --- a/src/Avalonia.X11/Glx/GlxDisplay.cs +++ b/src/Avalonia.X11/Glx/GlxDisplay.cs @@ -18,7 +18,7 @@ namespace Avalonia.X11.Glx public XVisualInfo* VisualInfo => _visual; public GlxContext DeferredContext { get; } public GlxInterface Glx { get; } = new GlxInterface(); - public GlxDisplay(X11Info x11, List probeProfiles) + public GlxDisplay(X11Info x11, IList probeProfiles) { _x11 = x11; _probeProfiles = probeProfiles.ToList(); diff --git a/src/Avalonia.X11/Glx/GlxPlatformFeature.cs b/src/Avalonia.X11/Glx/GlxPlatformFeature.cs index e3250e6733..ad3a54bcc1 100644 --- a/src/Avalonia.X11/Glx/GlxPlatformFeature.cs +++ b/src/Avalonia.X11/Glx/GlxPlatformFeature.cs @@ -12,7 +12,7 @@ namespace Avalonia.X11.Glx public GlxContext DeferredContext { get; private set; } public IGlContext MainContext => DeferredContext; - public static bool TryInitialize(X11Info x11, List glProfiles) + public static bool TryInitialize(X11Info x11, IList glProfiles) { var feature = TryCreate(x11, glProfiles); if (feature != null) @@ -24,7 +24,7 @@ namespace Avalonia.X11.Glx return false; } - public static GlxGlPlatformFeature TryCreate(X11Info x11, List glProfiles) + public static GlxGlPlatformFeature TryCreate(X11Info x11, IList glProfiles) { try { diff --git a/src/Avalonia.X11/X11Platform.cs b/src/Avalonia.X11/X11Platform.cs index 7f3255d4da..d7bd81db98 100644 --- a/src/Avalonia.X11/X11Platform.cs +++ b/src/Avalonia.X11/X11Platform.cs @@ -103,7 +103,7 @@ namespace Avalonia public bool UseDBusMenu { get; set; } public bool UseDeferredRendering { get; set; } = true; - public List GlProfiles { get; set; } = new List + public IList GlProfiles { get; set; } = new List { new GlVersion(GlProfileType.OpenGL, 4, 0), new GlVersion(GlProfileType.OpenGL, 3, 2), @@ -113,7 +113,7 @@ namespace Avalonia new GlVersion(GlProfileType.OpenGLES, 2, 0) }; - public List GlxRendererBlacklist { get; set; } = new List + public IList GlxRendererBlacklist { get; set; } = new List { // llvmpipe is a software GL rasterizer. If it's returned by glGetString, // that usually means that something in the system is horribly misconfigured From 5015c431a8bd07a83e36c156f62d6089fd023c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20Komosi=C5=84ski?= Date: Tue, 15 Sep 2020 17:02:28 +0200 Subject: [PATCH 3/4] Fix nullable annotations. --- src/Avalonia.Input/KeyGesture.cs | 12 +++++------- src/Avalonia.Input/PointerEventArgs.cs | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Input/KeyGesture.cs b/src/Avalonia.Input/KeyGesture.cs index ad447794bc..aa6fcc8bff 100644 --- a/src/Avalonia.Input/KeyGesture.cs +++ b/src/Avalonia.Input/KeyGesture.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; using System.Text; namespace Avalonia.Input @@ -29,7 +27,7 @@ namespace Avalonia.Input KeyModifiers = modifiers; } - public bool Equals(KeyGesture other) + public bool Equals(KeyGesture? other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; @@ -37,12 +35,12 @@ namespace Avalonia.Input return Key == other.Key && KeyModifiers == other.KeyModifiers; } - public override bool Equals(object obj) + public override bool Equals(object? obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; - return obj is KeyGesture && Equals((KeyGesture)obj); + return obj is KeyGesture gesture && Equals(gesture); } public override int GetHashCode() @@ -53,12 +51,12 @@ namespace Avalonia.Input } } - public static bool operator ==(KeyGesture left, KeyGesture right) + public static bool operator ==(KeyGesture? left, KeyGesture? right) { return Equals(left, right); } - public static bool operator !=(KeyGesture left, KeyGesture right) + public static bool operator !=(KeyGesture? left, KeyGesture? right) { return !Equals(left, right); } diff --git a/src/Avalonia.Input/PointerEventArgs.cs b/src/Avalonia.Input/PointerEventArgs.cs index 1cbddf89aa..451f80b1df 100644 --- a/src/Avalonia.Input/PointerEventArgs.cs +++ b/src/Avalonia.Input/PointerEventArgs.cs @@ -86,14 +86,14 @@ namespace Avalonia.Input } [Obsolete("Use GetCurrentPoint")] - public PointerPoint GetPointerPoint(IVisual relativeTo) => GetCurrentPoint(relativeTo); + public PointerPoint GetPointerPoint(IVisual? relativeTo) => GetCurrentPoint(relativeTo); /// /// Returns the PointerPoint associated with the current event /// /// The visual which coordinate system to use. Pass null for toplevel coordinate system /// - public PointerPoint GetCurrentPoint(IVisual relativeTo) + public PointerPoint GetCurrentPoint(IVisual? relativeTo) => new PointerPoint(Pointer, GetPosition(relativeTo), _properties); /// From 0fefe3b5af4529624378f47e8cbbd9e980045164 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 16 Sep 2020 03:02:07 -0700 Subject: [PATCH 4/4] dont use egl 3.2 and 3.1 as they are still wip. --- src/Avalonia.OpenGL/AngleOptions.cs | 2 -- src/Avalonia.OpenGL/EglDisplay.cs | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/Avalonia.OpenGL/AngleOptions.cs b/src/Avalonia.OpenGL/AngleOptions.cs index 462bd56cbe..0807eb7ab4 100644 --- a/src/Avalonia.OpenGL/AngleOptions.cs +++ b/src/Avalonia.OpenGL/AngleOptions.cs @@ -12,8 +12,6 @@ namespace Avalonia.OpenGL public IList GlProfiles { get; set; } = new List { - new GlVersion(GlProfileType.OpenGLES, 3, 2), - new GlVersion(GlProfileType.OpenGLES, 3, 1), new GlVersion(GlProfileType.OpenGLES, 3, 0), new GlVersion(GlProfileType.OpenGLES, 2, 0) }; diff --git a/src/Avalonia.OpenGL/EglDisplay.cs b/src/Avalonia.OpenGL/EglDisplay.cs index 9edcaf2bc0..7f41e75d6a 100644 --- a/src/Avalonia.OpenGL/EglDisplay.cs +++ b/src/Avalonia.OpenGL/EglDisplay.cs @@ -65,8 +65,6 @@ namespace Avalonia.OpenGL var glProfiles = AvaloniaLocator.Current.GetService()?.GlProfiles ?? new[] { - new GlVersion(GlProfileType.OpenGLES, 3, 2), - new GlVersion(GlProfileType.OpenGLES, 3, 1), new GlVersion(GlProfileType.OpenGLES, 3, 0), new GlVersion(GlProfileType.OpenGLES, 2, 0) };