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
 |