/// <summary> /// Initializes a new instance of the <see cref="NativeDeviceContext"/> class. /// </summary> /// <param name='handle'> /// A <see cref="GCHandle"/> which is used to create the device context. /// </param> /// <exception cref='ArgumentNullException'> /// Is thrown when an argument passed to a method is invalid because it is <see langword="null" /> . /// </exception> /// <exception cref='InvalidOperationException'> /// Is thrown when an operation cannot be performed. /// </exception> public NativeDeviceContext(IntPtr handle) { if (handle == IntPtr.Zero) { throw new ArgumentException("handle is IntPtr.Zero"); } #if false // "Force" handle creation if (!window.IsHandleCreated && window.Handle != IntPtr.Zero) { throw new InvalidOperationException("invalid handle"); } #endif if ((_Display = Egl.GetDisplay(new IntPtr(Egl.DEFAULT_DISPLAY))) == IntPtr.Zero) { throw new InvalidOperationException("unable to get display handle"); } int[] major = new int[1], minor = new int[1]; if (Egl.Initialize(_Display, major, minor) == false) { throw new InvalidOperationException("unable to initialize the display"); } _NativeWindow = handle; _Version = new KhronosVersion(major[0], minor[0], KhronosVersion.ApiEgl); }
/// <summary> /// Initializes a new instance of the <see cref="NativeDeviceContext"/> class. /// </summary> /// <param name='window'> /// Window. /// </param> /// <exception cref='ArgumentNullException'> /// Is thrown when an argument passed to a method is invalid because it is <see langword="null" /> . /// </exception> /// <exception cref='InvalidOperationException'> /// Is thrown when an operation cannot be performed. /// </exception> public NativeDeviceContext(Control window) { if (window == null) { throw new ArgumentNullException("window"); } _Display = Egl.GetDisplay(IntPtr.Zero); Egl.Initialize(_Display, null, null); }
/// <summary> /// Default constructor. /// </summary> /// <param name="display"> /// A <see cref="IntPtr"/> that specifies the display handle to be passed to <see cref="Egl.GetDisplay(IntPtr)"/>. /// </param> protected NativeSurface(IntPtr display) { if ((_Display = Egl.GetDisplay(display)) == IntPtr.Zero) { throw new InvalidOperationException("unable to get display handle"); } int[] major = new int[1], minor = new int[1]; if (Egl.Initialize(_Display, major, minor) == false) { throw new InvalidOperationException("unable to initialize the display"); } _EglVersion = new KhronosVersion(major[0], minor[0], KhronosVersion.ApiEgl); }
/// <summary> /// Default constructor. /// </summary> protected NativeSurface() { try { if ((_Display = Egl.GetDisplay(new IntPtr(Egl.DEFAULT_DISPLAY))) == IntPtr.Zero) { throw new InvalidOperationException("unable to get display handle"); } int[] major = new int[1], minor = new int[1]; if (Egl.Initialize(_Display, major, minor) == false) { throw new InvalidOperationException("unable to initialize the display"); } _EglVersion = new KhronosVersion(major[0], minor[0], KhronosVersion.ApiEgl); } catch { Dispose(); throw; } }
/// <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> /// 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); } }