Browse Source

Merge pull request #4675 from AvaloniaUI/features/support-opengles-v3

opengl es 3.1, 3.0 and 2.0
danwalmsley 5 years ago
parent
commit
f89df9e2bc

+ 6 - 0
src/Avalonia.OpenGL/AngleOptions.cs

@@ -10,6 +10,12 @@ namespace Avalonia.OpenGL
 			DirectX11
         }
 
+        public IList<GlVersion> GlProfiles { get; set; } = new List<GlVersion>
+        {
+            new GlVersion(GlProfileType.OpenGLES, 3, 0),
+            new GlVersion(GlProfileType.OpenGLES, 2, 0)
+        };
+
         public IList<PlatformApi> AllowedPlatformApis { get; set; } = null;
     }
 }

+ 31 - 7
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,20 +62,43 @@ 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<AngleOptions>()?.GlProfiles
+                                    ?? new[]
+                                    {
+                                        new GlVersion(GlProfileType.OpenGLES, 3, 0),
+                                        new GlVersion(GlProfileType.OpenGLES, 2, 0)
+                                    };
+
+            var cfgs = glProfiles.Select(x =>
             {
-                new
+                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_CLIENT_VERSION, 2,
+                        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;

+ 1 - 1
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<GlVersion> probeProfiles) 
+        public GlxDisplay(X11Info x11, IList<GlVersion> probeProfiles) 
         {
             _x11 = x11;
             _probeProfiles = probeProfiles.ToList();

+ 2 - 2
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<GlVersion> glProfiles)
+        public static bool TryInitialize(X11Info x11, IList<GlVersion> 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<GlVersion> glProfiles)
+        public static GlxGlPlatformFeature TryCreate(X11Info x11, IList<GlVersion> glProfiles)
         {
             try
             {

+ 2 - 2
src/Avalonia.X11/X11Platform.cs

@@ -103,7 +103,7 @@ namespace Avalonia
         public bool UseDBusMenu { get; set; }
         public bool UseDeferredRendering { get; set; } = true;
 
-        public List<GlVersion> GlProfiles { get; set; } = new List<GlVersion>
+        public IList<GlVersion> GlProfiles { get; set; } = new List<GlVersion>
         {
             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<string> GlxRendererBlacklist { get; set; } = new List<string>
+        public IList<string> GlxRendererBlacklist { get; set; } = new List<string>
         {
             // llvmpipe is a software GL rasterizer. If it's returned by glGetString,
             // that usually means that something in the system is horribly misconfigured