/* * * EGLTool.java * * Created by Wuwang on 2016/11/11 * Copyright © 2016年 深圳哎吖科技. All rights reserved. */ package com.aiyaapp.camera.sdk.util; import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLContext; import javax.microedition.khronos.egl.EGLDisplay; import javax.microedition.khronos.egl.EGLSurface; import javax.microedition.khronos.opengles.GL10; /** * Description: */ public class EGLTool { private static Error err; private EGLTool(){} /** * * @param eglWidth * @param eglHeight * @return */ public static GL10 createGLES(int eglWidth, int eglHeight){ int[] attributes = new int[] { EGL10.EGL_SURFACE_TYPE, EGL10.EGL_PBUFFER_BIT, //离屏渲染 //EGL10.EGL_SURFACE_TYPE, EGL10.EGL_WINDOW_BIT, //前台渲染 EGL10.EGL_RED_SIZE, 8, //指定RGB中的R大小(bits) EGL10.EGL_GREEN_SIZE, 8, //指定G大小 EGL10.EGL_BLUE_SIZE, 8, //指定B大小 EGL10.EGL_ALPHA_SIZE, 8, //指定Alpha大小,以上四项实际上指定了像素格式 EGL10.EGL_DEPTH_SIZE, 16, //指定深度缓存(Z Buffer)大小 EGL10.EGL_RENDERABLE_TYPE, 4, //指定渲染api类别, 如上一小节描述,这里或者是硬编码的4(EGL14.EGL_OPENGL_ES2_BIT) EGL10.EGL_NONE }; //总是以EGL10.EGL_NONE结尾 int glAttrs[] = { 0x3098, 2, //0x3098是EGL14.EGL_CONTEXT_CLIENT_VERSION,但是4.2以前没有EGL14 EGL10.EGL_NONE, }; int pBufferAttrs[]={ EGL10.EGL_WIDTH,eglWidth, EGL10.EGL_HEIGHT,eglHeight, EGL10.EGL_NONE }; EGLContext mEGLContext; EGLConfig mEGLConfig; EGLSurface mEGLSurface; //获取EGL EGL10 mEGL=(EGL10)EGLContext.getEGL(); //获取默认显示设备,一般为设备主屏幕 EGLDisplay mDisplay=mEGL.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); //获取版本号,[0]为版本号,[1]为子版本号 int[] versions=new int[2]; mEGL.eglInitialize(mDisplay,versions); //获取EGL可用配置 EGLConfig[] configs = new EGLConfig[1]; int[] configNum = new int[1]; mEGL.eglChooseConfig(mDisplay, attributes, configs, 1, configNum); mEGLConfig = configs[0]; //创建EGLContext mEGLContext=mEGL.eglCreateContext(mDisplay,mEGLConfig,EGL10.EGL_NO_CONTEXT, glAttrs); if(mEGLContext==EGL10.EGL_NO_CONTEXT){ err= Error.NO_CONTEXT; return null; } //获取创建后台绘制的Surface mEGLSurface=mEGL.eglCreatePbufferSurface(mDisplay,mEGLConfig,pBufferAttrs); if(mEGLSurface==EGL10.EGL_NO_SURFACE){ int ec=mEGL.eglGetError(); err= Error.NO_BUFFER; return null; } if(!mEGL.eglMakeCurrent(mDisplay,mEGLSurface,mEGLSurface,mEGLContext)){ err= Error.MAKE_CURRENT; return null; } return (GL10)mEGLContext.getGL(); } public static Error getErr(){ Error e=err; err= Error.NO; return e; } public enum Error{ NO(0,"正常"), NO_CONTEXT(1,"无法获取EGLContext"), NO_BUFFER(2,"创建buffer surface故障"), MAKE_CURRENT(3,"最后创建失败"); private int state; private String msg; Error(int state,String msg){ this.state=state; this.msg=msg; } public int asInt(){ return state; } public String getMsg(){ return msg; } } }