Files
LuaCsForBarotraumaEP/Libraries/MonoGame.Framework/Src/MonoGame.Framework/Graphics/OpenGL.Android.cs
2019-06-25 16:00:44 +03:00

106 lines
3.6 KiB
C#

// MonoGame - Copyright (C) The MonoGame Team
// This file is subject to the terms and conditions defined in
// file 'LICENSE.txt', which is part of this source code package.
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Security;
using Android.Opengl;
using Javax.Microedition.Khronos.Egl;
using MonoGame.Utilities;
namespace MonoGame.OpenGL
{
internal partial class GL
{
// internal for Android is not used on other platforms
// it allows us to use either GLES or Full GL (if the GPU supports it)
internal delegate bool BindAPIDelegate (RenderApi api);
internal static BindAPIDelegate BindAPI;
public static IntPtr Library;
public static IntPtr libES1 = FuncLoader.LoadLibrary("libGLESv1_CM.so");
public static IntPtr libES2 = FuncLoader.LoadLibrary("libGLESv2.so");
public static IntPtr libES3 = FuncLoader.LoadLibrary("libGLESv3.so");
public static IntPtr libGL = FuncLoader.LoadLibrary("libGL.so");
static partial void LoadPlatformEntryPoints()
{
Android.Util.Log.Verbose("GL", "Loading Entry Points");
var eglBindLoaded = false;
try
{
BindAPI = FuncLoader.LoadFunction<BindAPIDelegate>(libGL, "eglBindAPI", true);
eglBindLoaded = true;
}
catch { }
var supportsFullGL = eglBindLoaded && BindAPI (RenderApi.GL);
if (!supportsFullGL) {
if (eglBindLoaded)
BindAPI (RenderApi.ES);
BoundApi = RenderApi.ES;
}
Android.Util.Log.Verbose("GL", "Bound {0}", BoundApi);
if (GL.BoundApi == GL.RenderApi.ES && libES3 != IntPtr.Zero)
Library = libES3;
if (GL.BoundApi == GL.RenderApi.ES && libES2 != IntPtr.Zero)
Library = libES2;
else if (GL.BoundApi == GL.RenderApi.GL && libGL != IntPtr.Zero)
Library = libGL;
}
private static T LoadFunction<T>(string function, bool throwIfNotFound = false)
{
return FuncLoader.LoadFunction<T>(Library, function, throwIfNotFound);
}
private static IGraphicsContext PlatformCreateContext (IWindowInfo info)
{
return null;//new GraphicsContext(info);
}
}
struct GLESVersion
{
const int EglContextClientVersion = 0x3098;
const int EglContextMinorVersion = 0x30fb;
public int Major;
public int Minor;
internal int[] GetAttributes()
{
int minor = Minor > -1 ? EglContextMinorVersion : EGL10.EglNone;
return new int[] { EglContextClientVersion, Major, minor, Minor, EGL10.EglNone };
}
public override string ToString()
{
return string.Format("{0}.{1}", Major, Minor == -1 ? 0 : Minor);
}
internal static IEnumerable<GLESVersion> GetSupportedGLESVersions()
{
if (GL.libES3 != IntPtr.Zero)
{
yield return new GLESVersion { Major = 3, Minor = 2 };
yield return new GLESVersion { Major = 3, Minor = 1 };
yield return new GLESVersion { Major = 3, Minor = 0 };
}
if (GL.libES2 != IntPtr.Zero)
{
// We pass -1 becuase when requesting a GLES 2.0 context we
// dont provide the Minor version.
yield return new GLESVersion { Major = 2, Minor = -1 };
}
yield return new GLESVersion();
}
}
}