summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2011-06-02 14:17:28 -0700
committerRomain Guy <romainguy@google.com>2011-06-02 14:30:06 -0700
commit6f7d9394ec69e9fb38ca5fc2caf6d2aef6f7442d (patch)
tree9c0392b20067d90921ca193f69f2965e45af469d
parentaef1987f4e53efdc29216ac66d7412678a762b2e (diff)
downloadframeworks_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.java23
-rw-r--r--core/java/android/view/HardwareRenderer.java14
-rw-r--r--core/jni/android_view_GLES20Canvas.cpp23
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 },