diff options
Diffstat (limited to 'core/java/android')
-rw-r--r-- | core/java/android/view/GLRenderer.java | 70 | ||||
-rw-r--r-- | core/java/android/view/HardwareRenderer.java | 32 | ||||
-rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 317 | ||||
-rw-r--r-- | core/java/android/view/View.java | 9 | ||||
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 224 |
5 files changed, 523 insertions, 129 deletions
diff --git a/core/java/android/view/GLRenderer.java b/core/java/android/view/GLRenderer.java index a195231..70428bc 100644 --- a/core/java/android/view/GLRenderer.java +++ b/core/java/android/view/GLRenderer.java @@ -635,11 +635,11 @@ public class GLRenderer extends HardwareRenderer { GLRenderer(boolean translucent) { mTranslucent = translucent; - loadSystemProperties(null); + loadSystemProperties(); } @Override - boolean loadSystemProperties(Surface surface) { + boolean loadSystemProperties() { boolean value; boolean changed = false; @@ -1102,11 +1102,6 @@ public class GLRenderer extends HardwareRenderer { } @Override - HardwareCanvas getCanvas() { - return mCanvas; - } - - @Override void setName(String name) { mName = name; } @@ -1129,6 +1124,66 @@ public class GLRenderer extends HardwareRenderer { } @Override + void drawDisplayList(DisplayList displayList, View.AttachInfo attachInfo, + HardwareDrawCallbacks callbacks, Rect dirty) { + if (canDraw()) { + if (!hasDirtyRegions()) { + dirty = null; + } + + // We are already on the correct thread + final int surfaceState = checkRenderContextUnsafe(); + if (surfaceState != SURFACE_STATE_ERROR) { + HardwareCanvas canvas = mCanvas; + + if (mProfileEnabled) { + mProfileLock.lock(); + } + + dirty = beginFrame(canvas, dirty, surfaceState); + + int saveCount = 0; + int status = DisplayList.STATUS_DONE; + + long start = getSystemTime(); + try { + status = prepareFrame(dirty); + + saveCount = canvas.save(); + callbacks.onHardwarePreDraw(canvas); + + status |= drawDisplayList(attachInfo, canvas, displayList, status); + } catch (Exception e) { + Log.e(LOG_TAG, "An error has occurred while drawing:", e); + } finally { + callbacks.onHardwarePostDraw(canvas); + canvas.restoreToCount(saveCount); + + mDrawDelta = getSystemTime() - start; + + if (mDrawDelta > 0) { + mFrameCount++; + + debugOverdraw(attachInfo, dirty, canvas, displayList); + debugDirtyRegions(dirty, canvas); + drawProfileData(attachInfo); + } + } + + onPostDraw(); + + swapBuffers(status); + + if (mProfileEnabled) { + mProfileLock.unlock(); + } + + attachInfo.mIgnoreDirtyState = false; + } + } + } + + @Override void draw(View view, View.AttachInfo attachInfo, HardwareDrawCallbacks callbacks, Rect dirty) { if (canDraw()) { @@ -1144,7 +1199,6 @@ public class GLRenderer extends HardwareRenderer { final int surfaceState = checkRenderContextUnsafe(); if (surfaceState != SURFACE_STATE_ERROR) { HardwareCanvas canvas = mCanvas; - attachInfo.mHardwareCanvas = canvas; if (mProfileEnabled) { mProfileLock.lock(); diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 5c0be4a..434d473 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -188,6 +188,9 @@ public abstract class HardwareRenderer { */ public static boolean sSystemRendererDisabled = false; + /** @hide */ + public static boolean sUseRenderThread = false; + private boolean mEnabled; private boolean mRequested = true; @@ -306,13 +309,6 @@ public abstract class HardwareRenderer { abstract int getHeight(); /** - * Gets the current canvas associated with this HardwareRenderer. - * - * @return the current HardwareCanvas - */ - abstract HardwareCanvas getCanvas(); - - /** * Outputs extra debugging information in the specified file descriptor. * @param pw */ @@ -335,7 +331,7 @@ public abstract class HardwareRenderer { * * @return True if a property has changed. */ - abstract boolean loadSystemProperties(Surface surface); + abstract boolean loadSystemProperties(); /** * Sets the directory to use as a persistent storage for hardware rendering @@ -412,6 +408,18 @@ public abstract class HardwareRenderer { Rect dirty); /** + * Temporary hook to draw a display list directly, only used if sUseRenderThread + * is true. + * + * @param displayList The display list to draw + * @param attachInfo AttachInfo tied to the specified view. + * @param callbacks Callbacks invoked when drawing happens. + * @param dirty The dirty rectangle to update, can be null. + */ + abstract void drawDisplayList(DisplayList displayList, View.AttachInfo attachInfo, + HardwareDrawCallbacks callbacks, Rect dirty); + + /** * Creates a new hardware layer. A hardware layer built by calling this * method will be treated as a texture layer, instead of as a render target. * @@ -517,10 +525,14 @@ public abstract class HardwareRenderer { * @return A hardware renderer backed by OpenGL. */ static HardwareRenderer create(boolean translucent) { + HardwareRenderer renderer = null; if (GLES20Canvas.isAvailable()) { - return new GLRenderer(translucent); + renderer = new GLRenderer(translucent); + } + if (renderer != null && sUseRenderThread) { + renderer = new ThreadedRenderer((GLRenderer)renderer); } - return null; + return renderer; } /** diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java new file mode 100644 index 0000000..4087313 --- /dev/null +++ b/core/java/android/view/ThreadedRenderer.java @@ -0,0 +1,317 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.view; + +import android.graphics.Rect; +import android.graphics.SurfaceTexture; +import android.os.Looper; +import android.os.SystemClock; +import android.os.Trace; +import android.util.Log; +import android.view.Surface.OutOfResourcesException; +import android.view.View.AttachInfo; + +import java.io.PrintWriter; +import java.lang.reflect.Method; +import java.util.HashMap; + +/** + * Hardware renderer that proxies the rendering to a render thread. Most calls + * are synchronous, however a few such as draw() are posted async. The display list + * is shared between the two threads and is guarded by a top level lock. + * + * The UI thread can block on the RenderThread, but RenderThread must never + * block on the UI thread. + * + * Note that although currently the EGL context & surfaces are created & managed + * by the render thread, the goal is to move that into a shared structure that can + * be managed by both threads. EGLSurface creation & deletion should ideally be + * done on the UI thread and not the RenderThread to avoid stalling the + * RenderThread with surface buffer allocation. + * + * @hide + */ +public class ThreadedRenderer extends HardwareRenderer { + private static final String LOGTAG = "ThreadedRenderer"; + + @SuppressWarnings("serial") + static HashMap<String, Method> sMethodLut = new HashMap<String, Method>() {{ + Method[] methods = HardwareRenderer.class.getDeclaredMethods(); + for (Method m : methods) { + put(m.getName(), m); + } + }}; + static boolean sNeedsInit = true; + + private HardwareRenderer mRemoteRenderer; + private int mWidth, mHeight; + private RTJob mPreviousDraw; + + ThreadedRenderer(GLRenderer backingRenderer) { + mRemoteRenderer = backingRenderer; + setEnabled(true); + if (sNeedsInit) { + sNeedsInit = false; + postToRenderThread(new Runnable() { + @Override + public void run() { + // Hack to allow GLRenderer to create a handler to post the EGL + // destruction to, although it'll never run + Looper.prepare(); + } + }); + } + } + + @Override + void destroy(boolean full) { + run("destroy", full); + } + + @Override + boolean initialize(Surface surface) throws OutOfResourcesException { + return (Boolean) run("initialize", surface); + } + + @Override + void updateSurface(Surface surface) throws OutOfResourcesException { + post("updateSurface", surface); + } + + @Override + void destroyLayers(View view) { + throw new NoSuchMethodError(); + } + + @Override + void destroyHardwareResources(View view) { + run("destroyHardwareResources", view); + } + + @Override + void invalidate(Surface surface) { + post("invalidate", surface); + } + + @Override + boolean validate() { + // TODO Remove users of this API + return false; + } + + @Override + boolean safelyRun(Runnable action) { + return (Boolean) run("safelyRun", action); + } + + @Override + void setup(int width, int height) { + mWidth = width; + mHeight = height; + post("setup", width, height); + } + + @Override + int getWidth() { + return mWidth; + } + + @Override + int getHeight() { + return mHeight; + } + + @Override + void dumpGfxInfo(PrintWriter pw) { + // TODO Auto-generated method stub + } + + @Override + long getFrameCount() { + // TODO Auto-generated method stub + return 0; + } + + @Override + boolean loadSystemProperties() { + return (Boolean) run("loadSystemProperties"); + } + + @Override + void pushLayerUpdate(HardwareLayer layer) { + throw new NoSuchMethodError(); + } + + @Override + void cancelLayerUpdate(HardwareLayer layer) { + throw new NoSuchMethodError(); + } + + @Override + void flushLayerUpdates() { + throw new NoSuchMethodError(); + } + + @Override + void drawDisplayList(DisplayList displayList, AttachInfo attachInfo, + HardwareDrawCallbacks callbacks, Rect dirty) { + throw new NoSuchMethodError(); + } + + /** + * TODO: Remove + * Temporary hack to allow RenderThreadTest prototype app to trigger + * replaying a DisplayList after modifying the displaylist properties + * + * @hide */ + public void repeatLastDraw() { + if (mPreviousDraw == null) { + throw new IllegalStateException("There isn't a previous draw"); + } + synchronized (mPreviousDraw) { + mPreviousDraw.completed = false; + } + mPreviousDraw.args[3] = null; + postToRenderThread(mPreviousDraw); + } + + @Override + void draw(View view, AttachInfo attachInfo, HardwareDrawCallbacks callbacks, Rect dirty) { + requireCompletion(mPreviousDraw); + + attachInfo.mIgnoreDirtyState = true; + attachInfo.mDrawingTime = SystemClock.uptimeMillis(); + view.mPrivateFlags |= View.PFLAG_DRAWN; + + view.mRecreateDisplayList = (view.mPrivateFlags & View.PFLAG_INVALIDATED) + == View.PFLAG_INVALIDATED; + view.mPrivateFlags &= ~View.PFLAG_INVALIDATED; + + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getDisplayList"); + DisplayList displayList = view.getDisplayList(); + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + + view.mRecreateDisplayList = false; + + mPreviousDraw = post("drawDisplayList", displayList, attachInfo, + callbacks, dirty); + } + + @Override + HardwareLayer createHardwareLayer(boolean isOpaque) { + throw new NoSuchMethodError(); + } + + @Override + HardwareLayer createHardwareLayer(int width, int height, boolean isOpaque) { + throw new NoSuchMethodError(); + } + + @Override + SurfaceTexture createSurfaceTexture(HardwareLayer layer) { + throw new NoSuchMethodError(); + } + + @Override + void setSurfaceTexture(HardwareLayer layer, SurfaceTexture surfaceTexture) { + throw new NoSuchMethodError(); + } + + @Override + void detachFunctor(int functor) { + throw new NoSuchMethodError(); + } + + @Override + boolean attachFunctor(AttachInfo attachInfo, int functor) { + throw new NoSuchMethodError(); + } + + @Override + void setName(String name) { + post("setName", name); + } + + private static void requireCompletion(RTJob job) { + if (job != null) { + synchronized (job) { + if (!job.completed) { + try { + job.wait(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + } + } + + private RTJob post(String method, Object... args) { + RTJob job = new RTJob(); + job.method = sMethodLut.get(method); + job.args = args; + job.target = mRemoteRenderer; + if (job.method == null) { + throw new NullPointerException("Couldn't find method: " + method); + } + postToRenderThread(job); + return job; + } + + private Object run(String method, Object... args) { + RTJob job = new RTJob(); + job.method = sMethodLut.get(method); + job.args = args; + job.target = mRemoteRenderer; + if (job.method == null) { + throw new NullPointerException("Couldn't find method: " + method); + } + synchronized (job) { + postToRenderThread(job); + try { + job.wait(); + return job.ret; + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + + static class RTJob implements Runnable { + Method method; + Object[] args; + Object target; + Object ret; + boolean completed = false; + + @Override + public void run() { + try { + ret = method.invoke(target, args); + synchronized (this) { + completed = true; + notify(); + } + } catch (Exception e) { + Log.e(LOGTAG, "Failed to invoke: " + method.getName(), e); + } + } + } + + /** @hide */ + public static native void postToRenderThread(Runnable runnable); +} diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 5d264b6..05366a7 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -11209,6 +11209,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * @hide + */ + public HardwareRenderer getHardwareRenderer() { + return mAttachInfo != null ? mAttachInfo.mHardwareRenderer : null; + } + + /** * <p>Causes the Runnable to be added to the message queue. * The runnable will be run on the user interface thread.</p> * @@ -18843,8 +18850,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, final Callbacks mRootCallbacks; - HardwareCanvas mHardwareCanvas; - IWindowId mIWindowId; WindowId mWindowId; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index ff74f9d..cbaf921 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -266,10 +266,10 @@ public final class ViewRootImpl implements ViewParent, int mScrollY; int mCurScrollY; Scroller mScroller; - HardwareLayer mResizeBuffer; - long mResizeBufferStartTime; - int mResizeBufferDuration; - static final Interpolator mResizeInterpolator = new AccelerateDecelerateInterpolator(); +// HardwareLayer mResizeBuffer; +// long mResizeBufferStartTime; +// int mResizeBufferDuration; +// static final Interpolator mResizeInterpolator = new AccelerateDecelerateInterpolator(); private ArrayList<LayoutTransition> mPendingTransitions; final ViewConfiguration mViewConfiguration; @@ -933,17 +933,17 @@ public final class ViewRootImpl implements ViewParent, return mAppVisible ? mView.getVisibility() : View.GONE; } - void disposeResizeBuffer() { - if (mResizeBuffer != null && mAttachInfo.mHardwareRenderer != null) { - mAttachInfo.mHardwareRenderer.safelyRun(new Runnable() { - @Override - public void run() { - mResizeBuffer.destroy(); - mResizeBuffer = null; - } - }); - } - } +// void disposeResizeBuffer() { +// if (mResizeBuffer != null && mAttachInfo.mHardwareRenderer != null) { +// mAttachInfo.mHardwareRenderer.safelyRun(new Runnable() { +// @Override +// public void run() { +// mResizeBuffer.destroy(); +// mResizeBuffer = null; +// } +// }); +// } +// } /** * Add LayoutTransition to the list of transitions to be started in the next traversal. @@ -1454,75 +1454,76 @@ public final class ViewRootImpl implements ViewParent, final boolean visibleInsetsChanged = !mPendingVisibleInsets.equals( mAttachInfo.mVisibleInsets); if (contentInsetsChanged) { - if (mWidth > 0 && mHeight > 0 && lp != null && - ((lp.systemUiVisibility|lp.subtreeSystemUiVisibility) - & View.SYSTEM_UI_LAYOUT_FLAGS) == 0 && - mSurface != null && mSurface.isValid() && - !mAttachInfo.mTurnOffWindowResizeAnim && - mAttachInfo.mHardwareRenderer != null && - mAttachInfo.mHardwareRenderer.isEnabled() && - mAttachInfo.mHardwareRenderer.validate() && - lp != null && !PixelFormat.formatHasAlpha(lp.format)) { - - disposeResizeBuffer(); - - boolean completed = false; - HardwareCanvas hwRendererCanvas = mAttachInfo.mHardwareRenderer.getCanvas(); - HardwareCanvas layerCanvas = null; - try { - if (mResizeBuffer == null) { - mResizeBuffer = mAttachInfo.mHardwareRenderer.createHardwareLayer( - mWidth, mHeight, false); - } else if (mResizeBuffer.getWidth() != mWidth || - mResizeBuffer.getHeight() != mHeight) { - mResizeBuffer.resize(mWidth, mHeight); - } - // TODO: should handle create/resize failure - layerCanvas = mResizeBuffer.start(hwRendererCanvas); - final int restoreCount = layerCanvas.save(); - - int yoff; - final boolean scrolling = mScroller != null - && mScroller.computeScrollOffset(); - if (scrolling) { - yoff = mScroller.getCurrY(); - mScroller.abortAnimation(); - } else { - yoff = mScrollY; - } - - layerCanvas.translate(0, -yoff); - if (mTranslator != null) { - mTranslator.translateCanvas(layerCanvas); - } - - DisplayList displayList = mView.mDisplayList; - if (displayList != null && displayList.isValid()) { - layerCanvas.drawDisplayList(displayList, null, - DisplayList.FLAG_CLIP_CHILDREN); - } else { - mView.draw(layerCanvas); - } - - drawAccessibilityFocusedDrawableIfNeeded(layerCanvas); - - mResizeBufferStartTime = SystemClock.uptimeMillis(); - mResizeBufferDuration = mView.getResources().getInteger( - com.android.internal.R.integer.config_mediumAnimTime); - completed = true; - - layerCanvas.restoreToCount(restoreCount); - } catch (OutOfMemoryError e) { - Log.w(TAG, "Not enough memory for content change anim buffer", e); - } finally { - if (mResizeBuffer != null) { - mResizeBuffer.end(hwRendererCanvas); - if (!completed) { - disposeResizeBuffer(); - } - } - } - } +// TODO: Do something with this... +// if (mWidth > 0 && mHeight > 0 && lp != null && +// ((lp.systemUiVisibility|lp.subtreeSystemUiVisibility) +// & View.SYSTEM_UI_LAYOUT_FLAGS) == 0 && +// mSurface != null && mSurface.isValid() && +// !mAttachInfo.mTurnOffWindowResizeAnim && +// mAttachInfo.mHardwareRenderer != null && +// mAttachInfo.mHardwareRenderer.isEnabled() && +// mAttachInfo.mHardwareRenderer.validate() && +// lp != null && !PixelFormat.formatHasAlpha(lp.format)) { +// +// disposeResizeBuffer(); +// +// boolean completed = false; +// HardwareCanvas hwRendererCanvas = mAttachInfo.mHardwareRenderer.getCanvas(); +// HardwareCanvas layerCanvas = null; +// try { +// if (mResizeBuffer == null) { +// mResizeBuffer = mAttachInfo.mHardwareRenderer.createHardwareLayer( +// mWidth, mHeight, false); +// } else if (mResizeBuffer.getWidth() != mWidth || +// mResizeBuffer.getHeight() != mHeight) { +// mResizeBuffer.resize(mWidth, mHeight); +// } +// // TODO: should handle create/resize failure +// layerCanvas = mResizeBuffer.start(hwRendererCanvas); +// final int restoreCount = layerCanvas.save(); +// +// int yoff; +// final boolean scrolling = mScroller != null +// && mScroller.computeScrollOffset(); +// if (scrolling) { +// yoff = mScroller.getCurrY(); +// mScroller.abortAnimation(); +// } else { +// yoff = mScrollY; +// } +// +// layerCanvas.translate(0, -yoff); +// if (mTranslator != null) { +// mTranslator.translateCanvas(layerCanvas); +// } +// +// DisplayList displayList = mView.mDisplayList; +// if (displayList != null && displayList.isValid()) { +// layerCanvas.drawDisplayList(displayList, null, +// DisplayList.FLAG_CLIP_CHILDREN); +// } else { +// mView.draw(layerCanvas); +// } +// +// drawAccessibilityFocusedDrawableIfNeeded(layerCanvas); +// +// mResizeBufferStartTime = SystemClock.uptimeMillis(); +// mResizeBufferDuration = mView.getResources().getInteger( +// com.android.internal.R.integer.config_mediumAnimTime); +// completed = true; +// +// layerCanvas.restoreToCount(restoreCount); +// } catch (OutOfMemoryError e) { +// Log.w(TAG, "Not enough memory for content change anim buffer", e); +// } finally { +// if (mResizeBuffer != null) { +// mResizeBuffer.end(hwRendererCanvas); +// if (!completed) { +// disposeResizeBuffer(); +// } +// } +// } +// } mAttachInfo.mContentInsets.set(mPendingContentInsets); if (DEBUG_LAYOUT) Log.v(TAG, "Content insets changing to: " + mAttachInfo.mContentInsets); @@ -1582,7 +1583,7 @@ public final class ViewRootImpl implements ViewParent, if (mScroller != null) { mScroller.abortAnimation(); } - disposeResizeBuffer(); +// disposeResizeBuffer(); // Our surface is gone if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) { @@ -2181,23 +2182,28 @@ public final class ViewRootImpl implements ViewParent, @Override public void onHardwarePostDraw(HardwareCanvas canvas) { - if (mResizeBuffer != null) { - mResizePaint.setAlpha(mResizeAlpha); - canvas.drawHardwareLayer(mResizeBuffer, 0.0f, mHardwareYOffset, mResizePaint); +// if (mResizeBuffer != null) { +// mResizePaint.setAlpha(mResizeAlpha); +// canvas.drawHardwareLayer(mResizeBuffer, 0.0f, mHardwareYOffset, mResizePaint); +// } + // TODO: this + if (!HardwareRenderer.sUseRenderThread) { + drawAccessibilityFocusedDrawableIfNeeded(canvas); } - drawAccessibilityFocusedDrawableIfNeeded(canvas); } /** * @hide */ void outputDisplayList(View view) { - if (mAttachInfo != null && mAttachInfo.mHardwareCanvas != null) { - DisplayList displayList = view.getDisplayList(); - if (displayList != null) { - mAttachInfo.mHardwareCanvas.outputDisplayList(displayList); - } - } + // TODO - route through HardwareCanvas so it can be + // proxied to the correct thread +// if (mAttachInfo != null && mAttachInfo.mHardwareCanvas != null) { +// DisplayList displayList = view.getDisplayList(); +// if (displayList != null) { +// mAttachInfo.mHardwareCanvas.outputDisplayList(displayList); +// } +// } } /** @@ -2342,17 +2348,17 @@ public final class ViewRootImpl implements ViewParent, final boolean scalingRequired = attachInfo.mScalingRequired; int resizeAlpha = 0; - if (mResizeBuffer != null) { - long deltaTime = SystemClock.uptimeMillis() - mResizeBufferStartTime; - if (deltaTime < mResizeBufferDuration) { - float amt = deltaTime/(float) mResizeBufferDuration; - amt = mResizeInterpolator.getInterpolation(amt); - animating = true; - resizeAlpha = 255 - (int)(amt*255); - } else { - disposeResizeBuffer(); - } - } +// if (mResizeBuffer != null) { +// long deltaTime = SystemClock.uptimeMillis() - mResizeBufferStartTime; +// if (deltaTime < mResizeBufferDuration) { +// float amt = deltaTime/(float) mResizeBufferDuration; +// amt = mResizeInterpolator.getInterpolation(amt); +// animating = true; +// resizeAlpha = 255 - (int)(amt*255); +// } else { +// disposeResizeBuffer(); +// } +// } final Rect dirty = mDirty; if (mSurfaceHolder != null) { @@ -2362,7 +2368,7 @@ public final class ViewRootImpl implements ViewParent, if (mScroller != null) { mScroller.abortAnimation(); } - disposeResizeBuffer(); +// disposeResizeBuffer(); } return; } @@ -2725,7 +2731,7 @@ public final class ViewRootImpl implements ViewParent, if (scrollY != mScrollY) { if (DEBUG_INPUT_RESIZE) Log.v(TAG, "Pan scroll changed: old=" + mScrollY + " , new=" + scrollY); - if (!immediate && mResizeBuffer == null) { + if (!immediate /*&& mResizeBuffer == null*/) { if (mScroller == null) { mScroller = new Scroller(mView.getContext()); } @@ -5404,7 +5410,7 @@ public final class ViewRootImpl implements ViewParent, // Hardware rendering if (mAttachInfo.mHardwareRenderer != null) { - if (mAttachInfo.mHardwareRenderer.loadSystemProperties(mSurface)) { + if (mAttachInfo.mHardwareRenderer.loadSystemProperties()) { invalidate(); } } |