mirror of https://github.com/alibaba/MNN.git
85 lines
3.4 KiB
C++
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
|