From 547d9ccaa2daa9278b061b3b716e09d2de3f77b2 Mon Sep 17 00:00:00 2001 From: Bastien Date: Fri, 21 Sep 2018 13:04:19 +0200 Subject: [PATCH] Add context creation helper function --- examples/opengl/CMakeLists.txt | 2 +- examples/opengl/context.inl | 69 ++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 examples/opengl/context.inl diff --git a/examples/opengl/CMakeLists.txt b/examples/opengl/CMakeLists.txt index 9f41d76..2d7d886 100644 --- a/examples/opengl/CMakeLists.txt +++ b/examples/opengl/CMakeLists.txt @@ -3,7 +3,7 @@ set(OpenGL_GL_PREFERENCE GLVND) find_package(OpenGL REQUIRED) find_package(OpenHMD REQUIRED) -add_executable(openglexample gl.c gl.h main.c vr_context.c vr_context.h) +add_executable(openglexample gl.c gl.h main.c vr_context.c vr_context.h context.inl) target_include_directories(openglexample PRIVATE ${OPENGL_INCLUDE_DIRS}) target_link_libraries(openglexample PRIVATE ${OPENGL_LIBRARIES}) target_link_libraries(openglexample PRIVATE m) diff --git a/examples/opengl/context.inl b/examples/opengl/context.inl new file mode 100644 index 0000000..5fa3316 --- /dev/null +++ b/examples/opengl/context.inl @@ -0,0 +1,69 @@ +#include +#include + +static inline bool create_context(EGLNativeDisplayType nativeDisplay, EGLNativeWindowType nativeWindow, const EGLint * config_attribs, const EGLint * context_attribs, const EGLint * surface_attribs, EGLDisplay * outDisplay, EGLContext * outContext, EGLSurface * outSurface) +{ + // + // get an EGL display connection + EGLDisplay display = eglGetDisplay(nativeDisplay); + + if (EGL_NO_DISPLAY == display) + { + return false; + } + + // + // initialize the EGL display connection + EGLint major, minor; + + if (!eglInitialize(display, &major, &minor)) + { + return false; + } + + // + // bind OpenGL API + eglBindAPI(EGL_OPENGL_API); + + // + // get an appropriate EGL frame buffer configuration + EGLint num_config; + EGLConfig configs[128]; + + if (!eglChooseConfig(display, config_attribs, configs, 128, &num_config)) + { + return false; + } + + EGLConfig config = configs[0]; // FIXME + + // + // create context + EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, context_attribs); + + if (EGL_NO_CONTEXT == context) + { + return false; + } + + // + // Create Surface + EGLSurface surface = eglCreateWindowSurface(display, config, nativeWindow, surface_attribs); + if (EGL_NO_SURFACE == surface) + { + return false; + } + + // + // Set current context + if (!eglMakeCurrent(display, surface, surface, context)) + { + return false; + } + + *outDisplay = display; + *outContext = context; + *outSurface = surface; + + return true; +}