/// <summary> /// Initialize RPi Broadcom VideoCore IV API. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void KhronosApi_PlatformInit_Rpi(object sender, EglEventArgs e) { if (Bcm.IsAvailable) { Bcm.bcm_host_init(); } }
/// <summary> /// Initialize OpenGL namespace static environment. This method shall be called before any other classes methods. /// </summary> public static void Initialize() { if (_Initialized == true) { return; // Already initialized } _Initialized = true; // Before linking procedures, append ANGLE directory in path string assemblyPath = GetAssemblyLocation(); string anglePath = null; switch (Platform.CurrentPlatformId) { case Platform.Id.WindowsNT: if (assemblyPath != null) { #if DEBUG if (IntPtr.Size == 8) { anglePath = Path.Combine(assemblyPath, @"ANGLE\winrt10d\x64"); } else { anglePath = Path.Combine(assemblyPath, @"ANGLE\winrt10d\x86"); } #else if (IntPtr.Size == 8) { anglePath = Path.Combine(assemblyPath, @"ANGLE\winrt10\x64"); } else { anglePath = Path.Combine(assemblyPath, @"ANGLE\winrt10\x86"); } #endif } break; case Platform.Id.Linux: // Note: on RPi libEGL.so depends on libGLESv2.so, so it's required to pre-load the shared library // Note: maybe a configurable and generic method for pre-loading assemblies may be introduced GetProcAddressLinux.GetLibraryHandle("libGLESv2.so", false); break; } // Include ANGLE path, if any #if NETSTANDARD1_1 if (anglePath != String.Empty) { OpenGL.GetProcAddressOS.AddLibraryDirectory(Path.Combine(assemblyPath, anglePath)); } #else if (anglePath != null && Directory.Exists(anglePath)) { OpenGL.GetProcAddressOS.AddLibraryDirectory(Path.Combine(assemblyPath, anglePath)); } #endif // Load procedures BindAPI(); if (IsAvailable == false) { return; } #if DEBUG string envEglInit = Environment.GetEnvironmentVariable("EGL_INIT"); if (envEglInit != null && envEglInit == "NO") { return; } #endif // Platform initialization EglEventArgs args = new EglEventArgs(); RaiseEglInitializing(args); // Get EGL information IntPtr eglDisplay = Egl.GetDisplay(args.Display); try { if (Initialize(eglDisplay, null, null) == false) { throw new InvalidOperationException("unable to initialize EGL"); } // Query EGL version string eglVersionString = QueryString(eglDisplay, VERSION); _CurrentVersion = KhronosVersion.Parse(eglVersionString, KhronosVersion.ApiEgl); // Query EGL vendor _Vendor = QueryString(eglDisplay, VENDOR); // Client APIs List <string> clientApis = new List <string>(); if (_CurrentVersion >= Version_120) { string clientApisString = QueryString(eglDisplay, CLIENT_APIS); string[] clientApiTokens = System.Text.RegularExpressions.Regex.Split(clientApisString, " "); foreach (string api in DeviceContextEGL.ConvertApiNames(clientApiTokens)) { clientApis.Add(api); } } _AvailableApis = clientApis.ToArray(); // Null device context for querying extensions using (DeviceContextEGL deviceContext = new DeviceContextEGL(args.Display, IntPtr.Zero)) { _CurrentExtensions = new Extensions(); _CurrentExtensions.Query(deviceContext); } } finally { Terminate(eglDisplay); } }
/// <summary> /// Raise the <see cref="EglInitializing"/>. /// </summary> /// <param name="e"> /// /// </param> protected static void RaiseEglInitializing(EglEventArgs e) { EglInitializing?.Invoke(null, e); }
/// <summary> /// Initialize OpenGL namespace static environment. This method shall be called before any other classes methods. /// </summary> public static void Initialize() { if (_Initialized == true) { return; // Already initialized } _Initialized = true; // Before linking procedures, append ANGLE directory in path string assemblyPath = Path.GetDirectoryName(Assembly.GetAssembly(typeof(Egl)).Location); string anglePath = null; switch (Platform.CurrentPlatformId) { case Platform.Id.WindowsNT: #if DEBUG if (IntPtr.Size == 8) { anglePath = Path.Combine(assemblyPath, @"ANGLE\winrt10d\x64"); } else { anglePath = Path.Combine(assemblyPath, @"ANGLE\winrt10d\x86"); } #else if (IntPtr.Size == 8) { anglePath = Path.Combine(assemblyPath, @"ANGLE\winrt10\x64"); } else { anglePath = Path.Combine(assemblyPath, @"ANGLE\winrt10\x86"); } #endif break; case Platform.Id.Linux: // Note: on RPi libEGL.so depends on libGLESv2.so, so it's required to pre-load the shared library GetProcAddressX11.GetLibraryHandle("libGLESv2.so", false); break; } // Include ANGLE path, if any if (anglePath != null && Directory.Exists(anglePath)) { OpenGL.GetProcAddress.GetProcAddressOS.AddLibraryDirectory(Path.Combine(assemblyPath, anglePath)); } // Load procedures string platformLibrary = GetPlatformLibrary(); try { LogComment("Querying EGL from {0}", platformLibrary); BindAPI <Egl>(platformLibrary, OpenGL.GetProcAddress.GetProcAddressOS); LogComment("EGL availability: {0}", IsAvailable); } catch (Exception exception) { /* Fail-safe (it may fail due Egl access) */ LogComment("EGL not available:\n{0}", exception.ToString()); } if (IsAvailable == false) { return; } #if DEBUG string envEglInit = Environment.GetEnvironmentVariable("EGL_INIT"); if (envEglInit != null && envEglInit == "NO") { return; } #endif // Platform initialization EglEventArgs args = new EglEventArgs(); RaiseEglInitializing(args); // Get EGL information IntPtr eglDisplay = Egl.GetDisplay(args.Display); try { if (Initialize(eglDisplay, null, null) == false) { throw new InvalidOperationException("unable to initialize EGL"); } // Query EGL version string eglVersionString = QueryString(eglDisplay, VERSION); _CurrentVersion = KhronosVersion.Parse(eglVersionString, KhronosVersion.ApiEgl); // Query EGL vendor _Vendor = QueryString(eglDisplay, VENDOR); // Client APIs if (_CurrentVersion >= Version_120) { string clientApisString = QueryString(eglDisplay, CLIENT_APIS); _AvailableApis = System.Text.RegularExpressions.Regex.Split(clientApisString, " "); } } finally { Terminate(eglDisplay); } }