@Override int[] getConfig(boolean dirtyRegions) { return new int[] { EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT, EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_DEPTH_SIZE, 0, EGL_CONFIG_CAVEAT, EGL_NONE, // TODO: Find a better way to choose the stencil size EGL_STENCIL_SIZE, mShowOverdraw ? GLES20Canvas.getStencilSize() : 0, EGL_SURFACE_TYPE, EGL_WINDOW_BIT | (dirtyRegions ? EGL14.EGL_SWAP_BEHAVIOR_PRESERVED_BIT : 0), EGL_NONE }; }
static void startTrimMemory(int level) { if (sEgl == null || sEglConfig == null) return; Gl20RendererEglContext managedContext = (Gl20RendererEglContext) sEglContextStorage.get(); // We do not have OpenGL objects if (managedContext == null) { return; } else { usePbufferSurface(managedContext.getContext()); } if (level >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE) { GLES20Canvas.flushCaches(GLES20Canvas.FLUSH_CACHES_FULL); } else if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { GLES20Canvas.flushCaches(GLES20Canvas.FLUSH_CACHES_MODERATE); } }
@Override public void onTerminate(final EGLContext eglContext) { // Make sure we do this on the correct thread. if (mHandler.getLooper() != Looper.myLooper()) { mHandler.post( new Runnable() { @Override public void run() { onTerminate(eglContext); } }); return; } synchronized (sEglLock) { if (sEgl == null) return; if (EGLImpl.getInitCount(sEglDisplay) == 1) { usePbufferSurface(eglContext); GLES20Canvas.terminateCaches(); sEgl.eglDestroyContext(sEglDisplay, eglContext); sEglContextStorage.set(null); sEglContextStorage.remove(); sEgl.eglDestroySurface(sEglDisplay, sPbuffer); sEgl.eglMakeCurrent(sEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); sEgl.eglReleaseThread(); sEgl.eglTerminate(sEglDisplay); sEgl = null; sEglDisplay = null; sEglConfig = null; sPbuffer = null; } } }
/** * Indicates whether hardware acceleration is available under any form for the view hierarchy. * * @return True if the view hierarchy can potentially be hardware accelerated, false otherwise */ public static boolean isAvailable() { return GLES20Canvas.isAvailable(); }
static HardwareRenderer create(boolean translucent) { if (GLES20Canvas.isAvailable()) { return new Gl20Renderer(translucent); } return null; }
@Override void pushLayerUpdate(HardwareLayer layer) { mGlCanvas.pushLayerUpdate(layer); }
@Override void onPostDraw() { mGlCanvas.onPostDraw(); }
@Override int onPreDraw(Rect dirty) { return mGlCanvas.onPreDraw(dirty); }
@Override void initCaches() { GLES20Canvas.initCaches(); }
@Override public void glDeleteFramebuffers(GL11ExtensionPack gl11ep, int n, int[] buffers, int offset) { GLES20.glDeleteFramebuffers(n, buffers, offset); GLES20Canvas.checkError(); }
@Override public void glDeleteBuffers(GL11 gl, int n, int[] buffers, int offset) { GLES20.glDeleteBuffers(n, buffers, offset); GLES20Canvas.checkError(); }
@Override public void glDeleteTextures(GL11 gl, int n, int[] textures, int offset) { GLES20.glDeleteTextures(n, textures, offset); GLES20Canvas.checkError(); }
@Override public void glGenBuffers(int n, int[] buffers, int offset) { GLES20.glGenBuffers(n, buffers, offset); GLES20Canvas.checkError(); }
@Override public int generateTexture() { GLES20.glGenTextures(1, mTempIntArray, 0); GLES20Canvas.checkError(); return mTempIntArray[0]; }