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
 |