MNN/source/backend/opengl/GLContext.cpp

85 lines
3.4 KiB
C++

//
// GLContext.cpp
// MNN
//
// Created by MNN on 2019/01/31.
// Copyright © 2018, Alibaba Group Holding Limited
//
#include "backend/opengl/GLContext.hpp"
namespace MNN {
namespace OpenGL {
GLContext::GLContext() {
if(!(eglGetCurrentContext() != EGL_NO_CONTEXT)){
mDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (mDisplay == EGL_NO_DISPLAY) {
MNN_PRINT("eglGetDisplay error !!! \n");
mIsCreateError = true;
}
int majorVersion;
int minorVersion;
eglInitialize(mDisplay, &majorVersion, &minorVersion);
EGLint numConfigs;
static const EGLint configAttribs[] = {EGL_SURFACE_TYPE,
EGL_PBUFFER_BIT,
EGL_RENDERABLE_TYPE,
EGL_OPENGL_ES2_BIT,
EGL_RED_SIZE,
8,
EGL_GREEN_SIZE,
8,
EGL_BLUE_SIZE,
8,
EGL_ALPHA_SIZE,
8,
EGL_NONE};
EGLConfig surfaceConfig;
if(!eglChooseConfig(mDisplay, configAttribs, &surfaceConfig, 1, &numConfigs)){
eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglTerminate(mDisplay);
mDisplay = EGL_NO_DISPLAY;
MNN_PRINT("eglChooseConfig error !!! \n");
mIsCreateError = true;
}
static const EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};
mContext = eglCreateContext(mDisplay, surfaceConfig, NULL, contextAttribs);
static const EGLint surfaceAttribs[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE};
mSurface = eglCreatePbufferSurface(mDisplay, surfaceConfig, surfaceAttribs);
eglMakeCurrent(mDisplay, mSurface, mSurface, mContext);
eglBindAPI(EGL_OPENGL_ES_API);
int major;
glGetIntegerv(GL_MAJOR_VERSION, &major);
if(major < 3){
mIsCreateError = true;
}
}else{
mContext = EGL_NO_CONTEXT;
MNN_PRINT("eglGetCurrentContext() != EGL_NO_CONTEXT \n");
mIsCreateError = true;
}
}
GLContext::~GLContext() {
if (mDisplay != EGL_NO_DISPLAY) {
if (mContext != EGL_NO_CONTEXT) {
eglDestroyContext(mDisplay, mContext);
mContext = EGL_NO_CONTEXT;
}
if (mSurface != EGL_NO_SURFACE) {
eglDestroySurface(mDisplay, mSurface);
mSurface = EGL_NO_SURFACE;
}
eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
eglTerminate(mDisplay);
mDisplay = EGL_NO_DISPLAY;
}
eglReleaseThread();
}
bool GLContext::isCreateError() const{
return mIsCreateError;
}
} // namespace OpenGL
} // namespace MNN