aboutsummaryrefslogtreecommitdiff
path: root/modules/gles/egl/egl_base.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gles/egl/egl_base.cpp')
-rw-r--r--modules/gles/egl/egl_base.cpp195
1 files changed, 195 insertions, 0 deletions
diff --git a/modules/gles/egl/egl_base.cpp b/modules/gles/egl/egl_base.cpp
new file mode 100644
index 0000000..6ee0b4c
--- /dev/null
+++ b/modules/gles/egl/egl_base.cpp
@@ -0,0 +1,195 @@
+/*
+ * egl_base.cpp - EGL base implementation
+ *
+ * Copyright (c) 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Author: Yinhang Liu <yinhangx.liu@intel.com>
+ */
+
+#include "egl_base.h"
+
+namespace XCam {
+
+EGLBase::EGLBase ()
+ : _display (EGL_NO_DISPLAY)
+ , _context (EGL_NO_CONTEXT)
+ , _surface (EGL_NO_SURFACE)
+{
+}
+
+EGLBase::~EGLBase ()
+{
+ if (_display != EGL_NO_DISPLAY) {
+ if (_context != EGL_NO_CONTEXT) {
+ destroy_context (_display, _context);
+ _context = EGL_NO_CONTEXT;
+ }
+
+ if (_surface != EGL_NO_SURFACE) {
+ destroy_surface (_display, _surface);
+ _surface = EGL_NO_SURFACE;
+ }
+
+ terminate (_display);
+ _display = EGL_NO_DISPLAY;
+ }
+}
+
+bool
+EGLBase::init ()
+{
+ bool ret = get_display (EGL_DEFAULT_DISPLAY, _display);
+ XCAM_FAIL_RETURN (ERROR, ret, false, "EGLInit: get display failed");
+
+ EGLint major, minor;
+ ret = initialize (_display, &major, &minor);
+ XCAM_FAIL_RETURN (ERROR, ret, false, "EGLInit: EGL initialize failed");
+ XCAM_LOG_INFO ("EGL version: %d.%d", major, minor);
+
+ EGLConfig configs;
+ EGLint num_config;
+ EGLint cfg_attribs[] = {EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR, EGL_NONE};
+ ret = choose_config (_display, cfg_attribs, &configs, 1, &num_config);
+ XCAM_FAIL_RETURN (ERROR, ret, false, "EGLInit: choose config failed");
+
+ EGLint ctx_attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};
+ ret = create_context (_display, configs, EGL_NO_CONTEXT, ctx_attribs, _context);
+ XCAM_FAIL_RETURN (ERROR, ret, false, "EGLInit: create context failed");
+
+ ret = make_current (_display, _surface, _surface, _context);
+ XCAM_FAIL_RETURN (ERROR, ret, false, "EGLInit: make current failed");
+
+ return true;
+}
+
+bool
+EGLBase::get_display (NativeDisplayType native_display, EGLDisplay &display)
+{
+ display = eglGetDisplay (native_display);
+ XCAM_FAIL_RETURN (
+ ERROR, display != EGL_NO_DISPLAY, false,
+ "EGLInit: get display failed");
+ return true;
+}
+
+bool
+EGLBase::initialize (EGLDisplay display, EGLint *major, EGLint *minor)
+{
+ EGLBoolean ret = eglInitialize (display, major, minor);
+ XCAM_FAIL_RETURN (
+ ERROR, ret == EGL_TRUE, false,
+ "EGLInit: initialize failed, error flag: %s",
+ EGL::error_string (EGL::get_error ()));
+ return true;
+}
+
+bool
+EGLBase::choose_config (
+ EGLDisplay display, EGLint const *attribs, EGLConfig *configs,
+ EGLint config_size, EGLint *num_config)
+{
+ EGLBoolean ret = eglChooseConfig (display, attribs, configs, config_size, num_config);
+ XCAM_FAIL_RETURN (
+ ERROR, ret == EGL_TRUE, false,
+ "EGLInit: choose config failed, error flag: %s",
+ EGL::error_string (EGL::get_error ()));
+ return true;
+}
+
+bool
+EGLBase::create_context (
+ EGLDisplay display, EGLConfig config, EGLContext share_context, EGLint const *attribs,
+ EGLContext &context)
+{
+ context = eglCreateContext (display, config, share_context, attribs);
+ XCAM_FAIL_RETURN (
+ ERROR, context != EGL_NO_CONTEXT, false,
+ "EGLInit: create context failed, error flag: %s",
+ EGL::error_string (EGL::get_error ()));
+ return true;
+}
+
+bool
+EGLBase::create_window_surface (
+ EGLDisplay display, EGLConfig config, NativeWindowType native_window, EGLint const *attribs,
+ EGLSurface &surface)
+{
+ surface = eglCreateWindowSurface (display, config, native_window, attribs);
+ XCAM_FAIL_RETURN (
+ ERROR, surface != EGL_NO_SURFACE, false,
+ "EGLInit: create window surface failed, error flag: %s",
+ EGL::error_string (EGL::get_error ()));
+ return true;
+}
+
+bool
+EGLBase::make_current (EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context)
+{
+ EGLBoolean ret = eglMakeCurrent (display, draw, read, context);
+ XCAM_FAIL_RETURN (
+ ERROR, ret == EGL_TRUE, false,
+ "EGLInit: make current failed, error flag: %s",
+ EGL::error_string (EGL::get_error ()));
+ return true;
+}
+
+bool
+EGLBase::swap_buffers (EGLDisplay display, EGLSurface surface)
+{
+ EGLBoolean ret = eglSwapBuffers (display, surface);
+ XCAM_FAIL_RETURN (
+ ERROR, ret == EGL_TRUE, false,
+ "EGLInit: swap buffers failed, error flag: %s",
+ EGL::error_string (EGL::get_error ()));
+ return true;
+}
+
+bool
+EGLBase::destroy_context (EGLDisplay display, EGLContext &context)
+{
+ EGLBoolean ret = eglDestroyContext (display, context);
+ XCAM_FAIL_RETURN (
+ ERROR, ret == EGL_TRUE, false,
+ "EGLInit: destroy context failed, error flag: %s",
+ EGL::error_string (EGL::get_error ()));
+ XCAM_FAIL_RETURN (ERROR, ret == EGL_TRUE, false, "EGLInit: destroy context failed");
+ return true;
+}
+
+bool
+EGLBase::destroy_surface (EGLDisplay display, EGLSurface &surface)
+{
+ EGLBoolean ret = eglDestroySurface (display, surface);
+ XCAM_FAIL_RETURN (
+ ERROR, ret == EGL_TRUE, false,
+ "EGLInit: destroy surface failed, error flag: %s",
+ EGL::error_string (EGL::get_error ()));
+ XCAM_FAIL_RETURN (ERROR, ret == EGL_TRUE, false, "EGLInit: destroy surface failed");
+ return true;
+}
+
+bool
+EGLBase::terminate (EGLDisplay display)
+{
+ EGLBoolean ret = eglTerminate (display);
+ XCAM_FAIL_RETURN (
+ ERROR, ret == EGL_TRUE, false,
+ "EGLInit: terminate failed, error flag: %s",
+ EGL::error_string (EGL::get_error ()));
+ XCAM_FAIL_RETURN (ERROR, ret == EGL_TRUE, false, "EGLInit: terminate failed");
+ return true;
+}
+
+}