Loading core/java/android/view/GLES20Canvas.java +23 −0 Original line number Diff line number Diff line Loading @@ -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() { Loading @@ -209,6 +217,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) { if (dirty != null) { Loading core/java/android/view/HardwareRenderer.java +13 −1 Original line number Diff line number Diff line Loading @@ -311,6 +311,7 @@ public abstract class HardwareRenderer { Paint mDebugPaint; boolean mDirtyRegions; final boolean mDirtyRegionsRequested; final int mGlVersion; final boolean mTranslucent; Loading @@ -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; } /** Loading Loading @@ -546,10 +548,20 @@ public abstract class HardwareRenderer { + 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(); Loading core/jni/android_view_GLES20Canvas.cpp +21 −2 Original line number Diff line number Diff line Loading @@ -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(); 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 // ---------------------------------------------------------------------------- Loading Loading @@ -676,6 +694,7 @@ static JNINativeMethod gMethods[] = { { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable }, #ifdef USE_OPENGL_RENDERER { "nIsBackBufferPreserved", "()Z", (void*) android_view_GLES20Canvas_isBackBufferPreserved }, { "nPreserveBackBuffer", "()Z", (void*) android_view_GLES20Canvas_preserveBackBuffer }, { "nCreateRenderer", "()I", (void*) android_view_GLES20Canvas_createRenderer }, Loading Loading
core/java/android/view/GLES20Canvas.java +23 −0 Original line number Diff line number Diff line Loading @@ -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() { Loading @@ -209,6 +217,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) { if (dirty != null) { Loading
core/java/android/view/HardwareRenderer.java +13 −1 Original line number Diff line number Diff line Loading @@ -311,6 +311,7 @@ public abstract class HardwareRenderer { Paint mDebugPaint; boolean mDirtyRegions; final boolean mDirtyRegionsRequested; final int mGlVersion; final boolean mTranslucent; Loading @@ -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; } /** Loading Loading @@ -546,10 +548,20 @@ public abstract class HardwareRenderer { + 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(); Loading
core/jni/android_view_GLES20Canvas.cpp +21 −2 Original line number Diff line number Diff line Loading @@ -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(); 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 // ---------------------------------------------------------------------------- Loading Loading @@ -676,6 +694,7 @@ static JNINativeMethod gMethods[] = { { "nIsAvailable", "()Z", (void*) android_view_GLES20Canvas_isAvailable }, #ifdef USE_OPENGL_RENDERER { "nIsBackBufferPreserved", "()Z", (void*) android_view_GLES20Canvas_isBackBufferPreserved }, { "nPreserveBackBuffer", "()Z", (void*) android_view_GLES20Canvas_preserveBackBuffer }, { "nCreateRenderer", "()I", (void*) android_view_GLES20Canvas_createRenderer }, Loading