Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java |
| index a6f7e7aba7142e03615502236f168d3d7f8aaec5..8fb536635630804908b240569e364c7eb7b11c28 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java |
| @@ -23,6 +23,7 @@ import org.chromium.base.Log; |
| import org.chromium.base.TraceEvent; |
| import org.chromium.base.annotations.CalledByNative; |
| import org.chromium.base.annotations.JNINamespace; |
| +import org.chromium.base.annotations.UsedByReflection; |
| import org.chromium.chrome.browser.ChromeSwitches; |
| import org.chromium.chrome.browser.compositor.layouts.Layout; |
| import org.chromium.chrome.browser.compositor.layouts.LayoutProvider; |
| @@ -39,12 +40,14 @@ import org.chromium.ui.base.WindowAndroid; |
| import org.chromium.ui.resources.AndroidResourceType; |
| import org.chromium.ui.resources.ResourceManager; |
| +import java.util.ArrayList; |
| +import java.util.List; |
| + |
| /** |
| * The is the {@link View} displaying the ui compositor results; including webpages and tabswitcher. |
| */ |
| @JNINamespace("android") |
| -public class CompositorView |
| - extends SurfaceView implements SurfaceHolder.Callback { |
| +public class CompositorView extends SurfaceView implements SurfaceHolder.Callback2 { |
| private static final String TAG = "CompositorView"; |
| private static final long NANOSECONDS_PER_MILLISECOND = 1000000; |
| @@ -73,6 +76,7 @@ public class CompositorView |
| private int mSurfaceWidth; |
| private int mSurfaceHeight; |
| private boolean mPreloadedResources; |
| + private List<Runnable> mDrawingFinishedCallbacks; |
| // The current SurfaceView pixel format. Defaults to OPAQUE. |
| private int mCurrentPixelFormat = PixelFormat.OPAQUE; |
| @@ -200,6 +204,9 @@ public class CompositorView |
| // Grab the Resource Manager |
| mResourceManager = nativeGetResourceManager(mNativeCompositorView); |
| + |
| + // Redraw in case there are callbacks pending |mDrawingFinishedCallbacks|. |
| + nativeSetNeedsComposite(mNativeCompositorView); |
| } |
| @Override |
| @@ -218,6 +225,19 @@ public class CompositorView |
| } |
| @Override |
| + public void surfaceRedrawNeeded(SurfaceHolder holder) { |
| + // Intentionally not implemented. |
| + } |
| + |
| + // TODO(boliu): Mark this override instead. |
| + @UsedByReflection("Android") |
| + public void surfaceRedrawNeededAsync(SurfaceHolder holder, Runnable drawingFinished) { |
| + if (mDrawingFinishedCallbacks == null) mDrawingFinishedCallbacks = new ArrayList<>(); |
| + mDrawingFinishedCallbacks.add(drawingFinished); |
| + if (mNativeCompositorView != 0) nativeSetNeedsComposite(mNativeCompositorView); |
| + } |
| + |
| + @Override |
| public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { |
| if (mNativeCompositorView == 0) return; |
| nativeSurfaceChanged(mNativeCompositorView, format, width, height, holder.getSurface()); |
| @@ -311,6 +331,16 @@ public class CompositorView |
| mRenderHost.didSwapFrame(pendingFrameCount); |
| } |
| + @CalledByNative |
| + private void didSwapBuffers() { |
| + List<Runnable> runnables = mDrawingFinishedCallbacks; |
| + mDrawingFinishedCallbacks = null; |
| + if (runnables == null) return; |
| + for (Runnable r : runnables) { |
|
Ted C
2017/03/03 21:00:16
drive by nit but since this is an ArrayList, you s
boliu
2017/03/03 21:04:05
Wait, is linked list less expensive?
|
| + r.run(); |
| + } |
| + } |
| + |
| /** |
| * Converts the layout into compositor layers. This is to be called on every frame the layout |
| * is changing. |