예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
            /// <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);
            }
예제 #4
0
            /// <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;
                }
            }
예제 #5
0
        /// <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);
            }
        }
예제 #6
0
        /// <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);
            }
        }