diff options
author | Romain Guy <romainguy@google.com> | 2011-06-02 14:17:28 -0700 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2011-06-02 14:30:06 -0700 |
commit | 6f7d9394ec69e9fb38ca5fc2caf6d2aef6f7442d (patch) | |
tree | 9c0392b20067d90921ca193f69f2965e45af469d | |
parent | aef1987f4e53efdc29216ac66d7412678a762b2e (diff) | |
download | frameworks_base-6f7d9394ec69e9fb38ca5fc2caf6d2aef6f7442d.zip frameworks_base-6f7d9394ec69e9fb38ca5fc2caf6d2aef6f7442d.tar.gz frameworks_base-6f7d9394ec69e9fb38ca5fc2caf6d2aef6f7442d.tar.bz2 |
Take advantage of EGL_BUFFER_PRESERVED on IMG.
The IMG architecture does not support the EGL_SWAP_BEHAVIOR_PRESERVED_BIT
in EGL configurations. This bit is used only to be able to change the
EGL_SWAP_BEHAVIOR, which matters when the default behavior is not the
one we want. However on IMG, the default swap behavior is the one we
desire.
Change-Id: Iff5980c97df9e41bc837e424baf83b8eadbb7161
-rw-r--r-- | core/java/android/view/GLES20Canvas.java | 23 | ||||
-rw-r--r-- | core/java/android/view/HardwareRenderer.java | 14 | ||||
-rw-r--r-- | core/jni/android_view_GLES20Canvas.cpp | 23 |
3 files changed, 57 insertions, 3 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index 2b79a76..d5cad96 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -201,6 +201,14 @@ class GLES20Canvas extends HardwareCanvas { private static native void nSetViewport(int renderer, int width, int height); /** + * Preserves the back buffer of the current surface after a buffer swap. + * Calling this method sets the EGL_SWAP_BEHAVIOR attribute of the current + * surface to EGL_BUFFER_PRESERVED. Calling this method requires an EGL + * config that supports EGL_SWAP_BEHAVIOR_PRESERVED_BIT. + * + * @return True if the swap behavior was successfully changed, + * false otherwise. + * * @hide */ public static boolean preserveBackBuffer() { @@ -208,6 +216,21 @@ class GLES20Canvas extends HardwareCanvas { } private static native boolean nPreserveBackBuffer(); + + /** + * Indicates whether the current surface preserves its back buffer + * after a buffer swap. + * + * @return True, if the surface's EGL_SWAP_BEHAVIOR is EGL_BUFFER_PRESERVED, + * false otherwise + * + * @hide + */ + public static boolean isBackBufferPreserved() { + return nIsBackBufferPreserved(); + } + + private static native boolean nIsBackBufferPreserved(); @Override void onPreDraw(Rect dirty) { diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 61a24a0..2611ec0 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -311,6 +311,7 @@ public abstract class HardwareRenderer { Paint mDebugPaint; boolean mDirtyRegions; + final boolean mDirtyRegionsRequested; final int mGlVersion; final boolean mTranslucent; @@ -325,6 +326,7 @@ public abstract class HardwareRenderer { final String dirtyProperty = SystemProperties.get(RENDER_DIRTY_REGIONS_PROPERTY, "true"); //noinspection PointlessBooleanExpression,ConstantConditions mDirtyRegions = RENDER_DIRTY_REGIONS && "true".equalsIgnoreCase(dirtyProperty); + mDirtyRegionsRequested = mDirtyRegions; } /** @@ -545,11 +547,21 @@ public abstract class HardwareRenderer { throw new Surface.OutOfResourcesException("eglMakeCurrent failed " + getEGLErrorString(sEgl.eglGetError())); } - + + // If mDirtyRegions is set, this means we have an EGL configuration + // with EGL_SWAP_BEHAVIOR_PRESERVED_BIT set if (mDirtyRegions) { if (!GLES20Canvas.preserveBackBuffer()) { Log.w(LOG_TAG, "Backbuffer cannot be preserved"); } + } else if (mDirtyRegionsRequested) { + // If mDirtyRegions is not set, our EGL configuration does not + // have EGL_SWAP_BEHAVIOR_PRESERVED_BIT; however, the default + // swap behavior might be EGL_BUFFER_PRESERVED, which means we + // want to set mDirtyRegions. We try to do this only if dirty + // regions were initially requested as part of the device + // configuration (see RENDER_DIRTY_REGIONS) + mDirtyRegions = GLES20Canvas.isBackBufferPreserved(); } return sEglContext.getGL(); diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index e2832ed..31988f7 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -91,11 +91,29 @@ static jboolean android_view_GLES20Canvas_preserveBackBuffer(JNIEnv* env, jobjec eglSurfaceAttrib(display, surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED); EGLint error = eglGetError(); - RENDERER_LOGD("Could not enable buffer preserved swap behavior (%x)", error); + if (error != EGL_SUCCESS) { + RENDERER_LOGD("Could not enable buffer preserved swap behavior (%x)", error); + } return error == EGL_SUCCESS; } +static jboolean android_view_GLES20Canvas_isBackBufferPreserved(JNIEnv* env, jobject clazz) { + EGLDisplay display = eglGetCurrentDisplay(); + EGLSurface surface = eglGetCurrentSurface(EGL_DRAW); + EGLint value; + + eglGetError(); + eglQuerySurface(display, surface, EGL_SWAP_BEHAVIOR, &value); + + EGLint error = eglGetError(); + if (error != EGL_SUCCESS) { + RENDERER_LOGD("Could not query buffer preserved swap behavior (%x)", error); + } + + return error == EGL_SUCCESS && value == EGL_BUFFER_PRESERVED; +} + // ---------------------------------------------------------------------------- // Constructors // ---------------------------------------------------------------------------- @@ -676,7 +694,8 @@ static JNINativeMethod gMethods[] = { { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable }, #ifdef USE_OPENGL_RENDERER - { "nPreserveBackBuffer", "()Z", (void*) android_view_GLES20Canvas_preserveBackBuffer }, + { "nIsBackBufferPreserved", "()Z", (void*) android_view_GLES20Canvas_isBackBufferPreserved }, + { "nPreserveBackBuffer", "()Z", (void*) android_view_GLES20Canvas_preserveBackBuffer }, { "nCreateRenderer", "()I", (void*) android_view_GLES20Canvas_createRenderer }, { "nDestroyRenderer", "(I)V", (void*) android_view_GLES20Canvas_destroyRenderer }, |