Beispiel #1
0
        public void Init(IntPtr nativeDeviceHandle, IntPtr nativeWindowHandle, PlatformBase platform)
        {
            _platform = platform;
            _eglLib   = platform.LoadLibrary("libEGL");
            if (_eglLib == IntPtr.Zero)
            {
                Engine.Log.Error("Couldn't load EGL.", MessageSource.Egl);
                return;
            }

            IntPtr gles = platform.LoadLibrary("libGLESv2");

            if (gles == IntPtr.Zero)
            {
                Engine.Log.Error("Couldn't load GLES.", MessageSource.Egl);
                return;
            }

            string extensions = Egl.QueryString(IntPtr.Zero, Egl.Query.EGL_EXTENSIONS);

            Egl.Error err = Egl.GetError();
            if (extensions == null || err != Egl.Error.Success)
            {
                Engine.Log.Error($"Couldn't load extensions. {err}", MessageSource.Egl);
                extensions = "";
            }

            _display = Egl.GetDisplay(nativeDeviceHandle);
            if (_display == IntPtr.Zero)
            {
                Engine.Log.Error($"Couldn't initialize display. {Egl.GetError()}", MessageSource.Egl);
                return;
            }

            var majorVersion = 3;
            int majorVer     = majorVersion;
            var minorVer     = 0;

            if (RenderDoc.Loaded)
            {
                minorVer = 1;
            }
            if (!Egl.Init(_display, ref majorVer, ref minorVer))
            {
                Engine.Log.Error($"Couldn't initialize Egl. {Egl.GetError()}", MessageSource.Egl);
                return;
            }

            // Pick config
            var totalConfigs = 0;

            Egl.GetConfigs(_display, null, 0, ref totalConfigs);
            if (totalConfigs == 0)
            {
                Engine.Log.Error($"No configs for current display. {Egl.GetError()}", MessageSource.Egl);
                return;
            }

            var configs = new IntPtr[totalConfigs];

            Egl.GetConfigs(_display, configs, totalConfigs, ref totalConfigs);
            if (totalConfigs == 0)
            {
                Engine.Log.Error($"No configs for current display. {Egl.GetError()}", MessageSource.Egl);
                return;
            }

            int configHandle = SupportedPixelFormat(configs);

            if (configHandle == 0)
            {
                Engine.Log.Error("No valid config found.", MessageSource.Egl);
                return;
            }

            IntPtr config = configs[configHandle - 1];

            if (!Egl.BindAPI(Egl.API.EGL_OPENGL_ES_API))
            {
                Engine.Log.Error($"Couldn't bind EGL API. {Egl.GetError()}", MessageSource.Egl);
                return;
            }

            int[] attributes =
            {
                (int)Egl.ContextAttribute.EGL_CONTEXT_CLIENT_VERSION,
                majorVersion,
                0x3038 // EGL_NONE
            };

            _context = Egl.CreateContext(_display, config, IntPtr.Zero, attributes);
            if (_context == IntPtr.Zero)
            {
                Engine.Log.Error($"Context creation failed. {Egl.GetError()}", MessageSource.Egl);
                return;
            }

            _surface = Egl.CreateWindowSurface(_display, config, nativeWindowHandle, null);
            if (_surface == IntPtr.Zero)
            {
                Engine.Log.Error($"Surface creation failed. {Egl.GetError()}", MessageSource.Egl);
                return;
            }

            Valid = true;
        }