一、EGL使用
1、創建EglHelper
public class EglHelper {
private EGL10 mEgl;
private EGLDisplay mEglDisplay;
private EGLContext mEglContext;
private EGLSurface mEglSurface;
public void initEgl(Surface surface, EGLContext eglContext)
{
//1、得到Egl實例
mEgl = (EGL10) EGLContext.getEGL();
//2、得到默認的顯示設備(就是窗口)
mEglDisplay = mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
if (mEglDisplay == EGL10.EGL_NO_DISPLAY) {
throw new RuntimeException("eglGetDisplay failed");
}
//3、初始化默認顯示設備
int[] version = new int[2];
if(!mEgl.eglInitialize(mEglDisplay, version)) {
throw new RuntimeException("eglInitialize failed");
}
//4、設置顯示設備的屬性
int [] attrbutes = new int[]{
EGL10.EGL_RED_SIZE, 8,
EGL10.EGL_GREEN_SIZE, 8,
EGL10.EGL_BLUE_SIZE, 8,
EGL10.EGL_ALPHA_SIZE, 8,
EGL10.EGL_DEPTH_SIZE, 8,
EGL10.EGL_STENCIL_SIZE, 8,
EGL10.EGL_RENDERABLE_TYPE, 4,
EGL10.EGL_NONE};
int[] num_config = new int[1];
if(!mEgl.eglChooseConfig(mEglDisplay, attrbutes, null, 1, num_config))
{
throw new IllegalArgumentException("eglChooseConfig failed");
}
int numConfigs = num_config[0];
if (numConfigs <= 0) {
throw new IllegalArgumentException(
"No configs match configSpec");
}
//5、從系統中獲取對應屬性的配置
EGLConfig[] configs = new EGLConfig[numConfigs];
if (!mEgl.eglChooseConfig(mEglDisplay, attrbutes, configs, numConfigs,
num_config)) {
throw new IllegalArgumentException("eglChooseConfig#2 failed");
}
//6、創建EglContext
if(eglContext != null)
{
mEglContext = mEgl.eglCreateContext(mEglDisplay, configs[0], eglContext, null);
}
else
{
mEglContext = mEgl.eglCreateContext(mEglDisplay, configs[0], EGL10.EGL_NO_CONTEXT, null);
}
//7、創建渲染的Surface
mEglSurface = mEgl.eglCreateWindowSurface(mEglDisplay, configs[0], surface, null);
//8、綁定EglContext和Surface到顯示設備中
if(!mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext))
{
throw new RuntimeException("eglMakeCurrent fail");
}
}
public boolean swapBuffers()
{
if(mEgl != null)
{
return mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
}
else
{
throw new RuntimeException("egl is null");
}
}
public EGLContext getmEglContext() {
return mEglContext;
}
public void destoryEgl()
{
if(mEgl != null)
{
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_SURFACE,
EGL10.EGL_NO_CONTEXT);
mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
mEglSurface = null;
mEgl.eglDestroyContext(mEglDisplay, mEglContext);
mEglContext = null;
mEgl.eglTerminate(mEglDisplay);
mEglDisplay = null;
mEgl = null;
}
}
}
2、使用EglHelper
public class MainActivity extends AppCompatActivity {
private static String TAG = "MainActivity";
private SurfaceView surfaceView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = findViewById(R.id.surfaceview);
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCreated()");
}
@Override
public void surfaceChanged(final SurfaceHolder holder, int format, final int width, final int height) {
Log.i(TAG, "surfaceChanged()"+"=width="+width+"==height="+height);
new Thread(){
@Override
public void run() {
super.run();
EglHelper eglHelper = new EglHelper();
eglHelper.initEgl(holder.getSurface(), null);
while(true)
{
GLES20.glViewport(0, 0, width, height);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
eglHelper.swapBuffers();
try {
Thread.sleep(16);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//egl.destroy
}
});
}
}
3、代碼執行流程
2019-12-05 20:33:15.864 4926-4926/? I/MainActivity: surfaceCreated()
2019-12-05 20:33:15.864 4926-4926/? I/MainActivity: surfaceChanged()=width=1080==height=1792