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

Commit 3adcf9ab authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "Display: Dirty region propagation"

parents c6829793 d63aa21a
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -835,6 +835,8 @@ public abstract class HardwareRenderer {
        static final ThreadLocal<ManagedEGLContext> sEglContextStorage
                = new ThreadLocal<ManagedEGLContext>();

        private Surface mSurface = null;

        EGLContext mEglContext;
        Thread mEglThread;

@@ -1356,7 +1358,7 @@ public abstract class HardwareRenderer {
            }

            enableDirtyRegions();

            mSurface = surface;
            return true;
        }

@@ -1461,7 +1463,12 @@ public abstract class HardwareRenderer {
                    long start = getSystemTime();
                    try {
                        status = prepareFrame(dirty);

                        // sometimes we get the dirty rect as null
                        // and also its better to check the surface
                        // validity to avoid any crash.
                        if(mSurface.isValid() && dirty != null) {
                                mSurface.setDirtyRegion(dirty);
                        }
                        saveCount = canvas.save();
                        callbacks.onHardwarePreDraw(canvas);

+11 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ public class Surface implements Parcelable {
    private static native boolean nativeIsConsumerRunningBehind(int nativeObject);
    private static native int nativeReadFromParcel(int nativeObject, Parcel source);
    private static native void nativeWriteToParcel(int nativeObject, Parcel dest);
    private static native void nativeSetDirtyRegion(int nativeObject, Rect dirty);

    public static final Parcelable.Creator<Surface> CREATOR =
            new Parcelable.Creator<Surface>() {
@@ -148,6 +149,16 @@ public class Surface implements Parcelable {
        }
    }

    /**
     * Set dirty region passed from HW renderer.
     * @hide
     */
    public void setDirtyRegion(Rect dirty) {
        if (mNativeObject != 0) {
            nativeSetDirtyRegion(mNativeObject,dirty);
        }
    }

    /**
     * Release the local reference to the server-side surface.
     * Always call release() when you're done with a Surface.
+31 −0
Original line number Diff line number Diff line
@@ -188,6 +188,35 @@ static inline SkBitmap::Config convertPixelFormat(PixelFormat format) {
    }
}

static void nativeSetDirtyRegion(JNIEnv* env, jclass clazz,
        jint nativeObject, jobject dirtyRect) {

    sp<Surface> surface(reinterpret_cast<Surface *>(nativeObject));

    if (!isSurfaceValid(surface)) {
        doThrowIAE(env);
        return;
    }

    // get dirty region
    Region dirtyRegion;
    Rect dirty;

    dirty.left = env->GetIntField(dirtyRect, gRectClassInfo.left);
    dirty.top = env->GetIntField(dirtyRect, gRectClassInfo.top);
    dirty.right = env->GetIntField(dirtyRect, gRectClassInfo.right);
    dirty.bottom = env->GetIntField(dirtyRect, gRectClassInfo.bottom);

    if (!dirty.isEmpty()) {
       dirtyRegion.set(dirty);
    }

    status_t err = surface->setDirtyRegion(&dirtyRegion);
    if (err < 0) {
        doThrowIAE(env);
    }
}

static inline void swapCanvasPtr(JNIEnv* env, jobject canvasObj, SkCanvas* newCanvas) {
  jobject canvasFinalizerObj = env->GetObjectField(canvasObj, gCanvasClassInfo.mFinalizer);
  SkCanvas* previousCanvas = reinterpret_cast<SkCanvas*>(
@@ -369,6 +398,8 @@ static JNINativeMethod gSurfaceMethods[] = {
            (void*)nativeReadFromParcel },
    {"nativeWriteToParcel", "(ILandroid/os/Parcel;)V",
            (void*)nativeWriteToParcel },
    {"nativeSetDirtyRegion", "(ILandroid/graphics/Rect;)V",
           (void*)nativeSetDirtyRegion },
};

int register_android_view_Surface(JNIEnv* env)