From 0400665c57a872f751079f6c4ff2af1ff3a64108 Mon Sep 17 00:00:00 2001 From: Dragorn421 Date: Sat, 3 Aug 2024 20:40:59 +0200 Subject: [PATCH] Fix #13807 (#16539) Co-authored-by: Julien Lebosquain --- src/Avalonia.OpenGL/GlBasicInfoInterface.cs | 13 +++++++++++++ src/Avalonia.OpenGL/GlInterface.cs | 3 --- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.OpenGL/GlBasicInfoInterface.cs b/src/Avalonia.OpenGL/GlBasicInfoInterface.cs index 750b34a13f..2eddefaaf8 100644 --- a/src/Avalonia.OpenGL/GlBasicInfoInterface.cs +++ b/src/Avalonia.OpenGL/GlBasicInfoInterface.cs @@ -25,6 +25,9 @@ namespace Avalonia.OpenGL [GetProcAddress("glGetStringi")] public partial IntPtr GetStringiNative(int v, int v1); + [GetProcAddress("glGetError")] + public partial int GetError(); + public string? GetString(int v) { var ptr = GetStringNative(v); @@ -43,9 +46,19 @@ namespace Avalonia.OpenGL public List GetExtensions() { + // On some (generally older) versions of OpenGL, GL_EXTENSIONS is a space-separated list of available extensions. + // For example: + // https://learn.microsoft.com/en-us/windows/win32/opengl/glgetstring + // https://docs.gl/gl2/glGetString + // https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glGetString.xhtml var sp = GetString(GlConsts.GL_EXTENSIONS); if (sp != null) return sp.Split(' ').ToList(); + // The OpenGL version is not such a version. + // Consume the GL_INVALID_ENUM error from the GetString call above. + GetError(); + + // For other (generally newer) versions GetIntegerv(GlConsts.GL_NUM_EXTENSIONS, out int count); var rv = new List(count); for (var c = 0; c < count; c++) diff --git a/src/Avalonia.OpenGL/GlInterface.cs b/src/Avalonia.OpenGL/GlInterface.cs index 618d8a0537..26bea6206d 100644 --- a/src/Avalonia.OpenGL/GlInterface.cs +++ b/src/Avalonia.OpenGL/GlInterface.cs @@ -52,9 +52,6 @@ namespace Avalonia.OpenGL public IntPtr GetProcAddress(string proc) => _getProcAddress(proc); - [GetProcAddress("glGetError")] - public partial int GetError(); - [GetProcAddress("glClearStencil")] public partial void ClearStencil(int s);