diff options
author | Romain Guy <romainguy@google.com> | 2011-03-07 22:45:52 -0800 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-03-07 22:45:52 -0800 |
commit | f7098ce95dde39a33ca280bd1ef9a13259e7b7e5 (patch) | |
tree | d65b1a845662999e02de568916d65af1eacfd0a1 /core | |
parent | 8b4a4207f6683ee3d9aaf9510a64c2f3589a5d69 (diff) | |
parent | d00353fe3191571a6773ef2d11921cfcff260bc4 (diff) | |
download | frameworks_base-f7098ce95dde39a33ca280bd1ef9a13259e7b7e5.zip frameworks_base-f7098ce95dde39a33ca280bd1ef9a13259e7b7e5.tar.gz frameworks_base-f7098ce95dde39a33ca280bd1ef9a13259e7b7e5.tar.bz2 |
am d00353fe: am bc8a8e8c: Merge "Add support for partial invalidates in WebView Bug #3461349" into honeycomb-mr1
* commit 'd00353fe3191571a6773ef2d11921cfcff260bc4':
Add support for partial invalidates in WebView Bug #3461349
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/view/GLES20Canvas.java | 7 | ||||
-rw-r--r-- | core/java/android/view/HardwareCanvas.java | 7 | ||||
-rw-r--r-- | core/java/android/view/HardwareRenderer.java | 17 | ||||
-rw-r--r-- | core/java/android/view/ViewGroup.java | 2 | ||||
-rw-r--r-- | core/java/android/webkit/WebView.java | 14 | ||||
-rw-r--r-- | core/jni/android_view_GLES20Canvas.cpp | 22 |
6 files changed, 44 insertions, 25 deletions
diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index 9a6a274..fa5479b 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -245,11 +245,12 @@ class GLES20Canvas extends HardwareCanvas { private static native void nDestroyDisplayList(int displayList); @Override - public boolean drawDisplayList(DisplayList displayList) { - return nDrawDisplayList(mRenderer, ((GLES20DisplayList) displayList).mNativeDisplayList); + public boolean drawDisplayList(DisplayList displayList, Rect dirty) { + return nDrawDisplayList(mRenderer, + ((GLES20DisplayList) displayList).mNativeDisplayList, dirty); } - private static native boolean nDrawDisplayList(int renderer, int displayList); + private static native boolean nDrawDisplayList(int renderer, int displayList, Rect dirty); /////////////////////////////////////////////////////////////////////////// // Hardware layer diff --git a/core/java/android/view/HardwareCanvas.java b/core/java/android/view/HardwareCanvas.java index e6fecc8..cb1003a 100644 --- a/core/java/android/view/HardwareCanvas.java +++ b/core/java/android/view/HardwareCanvas.java @@ -53,8 +53,13 @@ public abstract class HardwareCanvas extends Canvas { * Draws the specified display list onto this canvas. * * @param displayList The display list to replay. + * @param dirty The dirty region to redraw in the next pass, matters only + * if this method returns true, can be null. + * + * @return True if the content of the display list requires another + * drawing pass (invalidate()), false otherwise */ - abstract boolean drawDisplayList(DisplayList displayList); + abstract boolean drawDisplayList(DisplayList displayList, Rect dirty); /** * Draws the specified layer onto this canvas. diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index b53aa21..c078c08 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -269,7 +269,7 @@ public abstract class HardwareRenderer { static EGLDisplay sEglDisplay; static EGLConfig sEglConfig; - private static Thread sEglThread; + private static Thread sEglThread; EGLSurface mEglSurface; @@ -284,6 +284,8 @@ public abstract class HardwareRenderer { final boolean mTranslucent; private boolean mDestroyed; + + private final Rect mRedrawClip = new Rect(); GlRenderer(int glVersion, boolean translucent) { mGlVersion = glVersion; @@ -606,8 +608,13 @@ public abstract class HardwareRenderer { DisplayList displayList = view.getDisplayList(); if (displayList != null) { - if (canvas.drawDisplayList(displayList)) { - view.invalidate(); + if (canvas.drawDisplayList(displayList, mRedrawClip)) { + if (mRedrawClip.isEmpty()) { + view.invalidate(); + } else { + view.getParent().invalidateChild(view, mRedrawClip); + } + mRedrawClip.setEmpty(); } } else { // Shouldn't reach here @@ -646,8 +653,8 @@ public abstract class HardwareRenderer { private int checkCurrent() { // TODO: Don't check the current context when we have one per UI thread // TODO: Use a threadlocal flag to know whether the surface has changed - if (sEgl.eglGetCurrentContext() != sEglContext || - sEgl.eglGetCurrentSurface(EGL10.EGL_DRAW) != mEglSurface) { + if (!sEglContext.equals(sEgl.eglGetCurrentContext()) || + !mEglSurface.equals(sEgl.eglGetCurrentSurface(EGL10.EGL_DRAW))) { if (!sEgl.eglMakeCurrent(sEglDisplay, mEglSurface, mEglSurface, sEglContext)) { fallback(true); Log.e(LOG_TAG, "eglMakeCurrent failed " + diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 9f1eef9..6ef680b 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -2585,7 +2585,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } else { child.mPrivateFlags &= ~DIRTY_MASK; - ((HardwareCanvas) canvas).drawDisplayList(displayList); + ((HardwareCanvas) canvas).drawDisplayList(displayList, null); } } } else if (cache != null) { diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 57fa4af..e3f2436 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -352,7 +352,8 @@ public class WebView extends AbsoluteLayout private ZoomManager mZoomManager; - private Rect mGLRectViewport = new Rect(); + private final Rect mGLRectViewport = new Rect(); + private final Rect mViewRectViewport = new Rect(); private boolean mGLViewportEmpty = false; /** @@ -4139,7 +4140,7 @@ public class WebView extends AbsoluteLayout if (canvas.isHardwareAccelerated()) { int functor = nativeGetDrawGLFunction(mGLViewportEmpty ? null : mGLRectViewport, - getScale(), extras); + mGLViewportEmpty ? null : mViewRectViewport, getScale(), extras); ((HardwareCanvas) canvas).callDrawGLFunction(functor); } else { DrawFilter df = null; @@ -5243,6 +5244,7 @@ public class WebView extends AbsoluteLayout // Then need to invert the Y axis, just for GL View rootView = getRootView(); int rootViewHeight = rootView.getHeight(); + mViewRectViewport.set(mGLRectViewport); int savedWebViewBottom = mGLRectViewport.bottom; mGLRectViewport.bottom = rootViewHeight - mGLRectViewport.top - getVisibleTitleHeight(); mGLRectViewport.top = rootViewHeight - savedWebViewBottom; @@ -5250,7 +5252,8 @@ public class WebView extends AbsoluteLayout } else { mGLViewportEmpty = true; } - nativeUpdateDrawGLFunction(mGLViewportEmpty ? null : mGLRectViewport); + nativeUpdateDrawGLFunction(mGLViewportEmpty ? null : mGLRectViewport, + mGLViewportEmpty ? null : mViewRectViewport); } /** @@ -8515,8 +8518,9 @@ public class WebView extends AbsoluteLayout boolean splitIfNeeded); private native void nativeDumpDisplayTree(String urlOrNull); private native boolean nativeEvaluateLayersAnimations(); - private native int nativeGetDrawGLFunction(Rect rect, float scale, int extras); - private native void nativeUpdateDrawGLFunction(Rect rect); + private native int nativeGetDrawGLFunction(Rect rect, Rect viewRect, + float scale, int extras); + private native void nativeUpdateDrawGLFunction(Rect rect, Rect viewRect); private native boolean nativeDrawGL(Rect rect, float scale, int extras); private native void nativeExtendSelection(int x, int y); private native int nativeFindAll(String findLower, String findUpper, diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index 7a609a5..a78f660 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -35,7 +35,6 @@ #include <DisplayListRenderer.h> #include <LayerRenderer.h> -#include <OpenGLDebugRenderer.h> #include <OpenGLRenderer.h> #include <SkiaShader.h> #include <SkiaColorFilter.h> @@ -60,7 +59,6 @@ using namespace uirenderer; // Debug #define DEBUG_RENDERER 0 -#define PROFILE_RENDERER 0 // Debug #if DEBUG_RENDERER @@ -99,11 +97,7 @@ static jboolean android_view_GLES20Canvas_preserveBackBuffer(JNIEnv* env, jobjec static OpenGLRenderer* android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject clazz) { RENDERER_LOGD("Create OpenGLRenderer"); -#if PROFILE_RENDERER - return new OpenGLDebugRenderer; -#else return new OpenGLRenderer; -#endif } static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz, @@ -139,7 +133,8 @@ static void android_view_GLES20Canvas_finish(JNIEnv* env, jobject clazz, static bool android_view_GLES20Canvas_callDrawGLFunction(JNIEnv* env, jobject clazz, OpenGLRenderer* renderer, Functor *functor) { - return renderer->callDrawGLFunction(functor); + android::uirenderer::Rect dirty; + return renderer->callDrawGLFunction(functor, dirty); } // ---------------------------------------------------------------------------- @@ -503,8 +498,14 @@ static void android_view_GLES20Canvas_destroyDisplayList(JNIEnv* env, } static bool android_view_GLES20Canvas_drawDisplayList(JNIEnv* env, - jobject clazz, OpenGLRenderer* renderer, DisplayList* displayList) { - return renderer->drawDisplayList(displayList); + jobject clazz, OpenGLRenderer* renderer, DisplayList* displayList, jobject dirty) { + android::uirenderer::Rect bounds; + bool redraw = renderer->drawDisplayList(displayList, bounds); + if (redraw && dirty != NULL) { + env->CallVoidMethod(dirty, gRectClassInfo.set, + int(bounds.left), int(bounds.top), int(bounds.right), int(bounds.bottom)); + } + return redraw; } // ---------------------------------------------------------------------------- @@ -663,7 +664,8 @@ static JNINativeMethod gMethods[] = { { "nGetDisplayList", "(I)I", (void*) android_view_GLES20Canvas_getDisplayList }, { "nDestroyDisplayList", "(I)V", (void*) android_view_GLES20Canvas_destroyDisplayList }, { "nGetDisplayListRenderer", "(I)I", (void*) android_view_GLES20Canvas_getDisplayListRenderer }, - { "nDrawDisplayList", "(II)Z", (void*) android_view_GLES20Canvas_drawDisplayList }, + { "nDrawDisplayList", "(IILandroid/graphics/Rect;)Z", + (void*) android_view_GLES20Canvas_drawDisplayList }, { "nInterrupt", "(I)V", (void*) android_view_GLES20Canvas_interrupt }, { "nResume", "(I)V", (void*) android_view_GLES20Canvas_resume }, |