Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b271137 authored by Romain Guy's avatar Romain Guy Committed by Android (Google) Code Review
Browse files

Merge "Take advantage of EGL_BUFFER_PRESERVED on IMG."

parents f32d43b2 6f7d9394
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -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() {
@@ -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) {
+13 −1
Original line number Diff line number Diff line
@@ -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;
        }

        /**
@@ -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();
+21 −2
Original line number Diff line number Diff line
@@ -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
// ----------------------------------------------------------------------------
@@ -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 },