diff options
| author | 2014-04-08 00:32:15 +0000 | |
|---|---|---|
| committer | 2014-04-08 00:32:15 +0000 | |
| commit | 85189c5dafb08f051c7024f42ceedcbcf5dbbc7c (patch) | |
| tree | 48e2653a88f94fa50aa00b45cf273da2c7b3accd | |
| parent | af22ce470112b8ee2ea7edf17b5d7c78e92d8ff7 (diff) | |
| parent | 28ad7b52e038ef0cdd89f753d9839444a434b299 (diff) | |
Merge "Fence on draws that are reported"
| -rw-r--r-- | core/java/android/view/GLRenderer.java | 5 | ||||
| -rw-r--r-- | core/java/android/view/HardwareRenderer.java | 5 | ||||
| -rw-r--r-- | core/java/android/view/ThreadedRenderer.java | 7 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 3 | ||||
| -rw-r--r-- | core/jni/android_view_ThreadedRenderer.cpp | 7 | ||||
| -rw-r--r-- | libs/hwui/renderthread/RenderProxy.cpp | 10 | ||||
| -rw-r--r-- | libs/hwui/renderthread/RenderProxy.h | 2 |
7 files changed, 39 insertions, 0 deletions
diff --git a/core/java/android/view/GLRenderer.java b/core/java/android/view/GLRenderer.java index d6e17813a005..ad33b6f55661 100644 --- a/core/java/android/view/GLRenderer.java +++ b/core/java/android/view/GLRenderer.java @@ -1226,6 +1226,11 @@ public class GLRenderer extends HardwareRenderer { } private static native void nSetDisplayListData(long displayList, long newData); + @Override + void fence() { + // Everything is immediate, so this is a no-op + } + private RenderNode buildDisplayList(View view, HardwareCanvas canvas) { if (mDrawDelta <= 0) { return view.mRenderNode; diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 4f646e10c702..ae265aad394b 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -576,6 +576,11 @@ public abstract class HardwareRenderer { abstract void setDisplayListData(long displayList, long newData); /** + * Blocks until all previously queued work has completed. + */ + abstract void fence(); + + /** * Describes a series of frames that should be drawn on screen as a graph. * Each frame is composed of 1 or more elements. */ diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 7b8a1ffb8315..3d143d777fd1 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -245,6 +245,11 @@ public class ThreadedRenderer extends HardwareRenderer { } @Override + void fence() { + nFence(mNativeProxy); + } + + @Override protected void finalize() throws Throwable { try { nDeleteProxy(mNativeProxy); @@ -277,4 +282,6 @@ public class ThreadedRenderer extends HardwareRenderer { private static native long nCreateTextureLayer(long nativeProxy); private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap); private static native void nDestroyLayer(long nativeProxy, long layer); + + private static native void nFence(long nativeProxy); } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index a35c28e21c6f..94f0683b496c 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2259,6 +2259,9 @@ public final class ViewRootImpl implements ViewParent, if (mReportNextDraw) { mReportNextDraw = false; + if (mAttachInfo.mHardwareRenderer != null) { + mAttachInfo.mHardwareRenderer.fence(); + } if (LOCAL_LOGV) { Log.v(TAG, "FINISHED DRAWING: " + mWindowAttributes.getTitle()); diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index 98bec1bbd9bc..32890cfee38f 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -182,6 +182,12 @@ static void android_view_ThreadedRenderer_destroyLayer(JNIEnv* env, jobject claz proxy->destroyLayer(layer); } +static void android_view_ThreadedRenderer_fence(JNIEnv* env, jobject clazz, + jlong proxyPtr) { + RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); + proxy->fence(); +} + #endif // ---------------------------------------------------------------------------- @@ -209,6 +215,7 @@ static JNINativeMethod gMethods[] = { { "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer }, { "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto }, { "nDestroyLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_destroyLayer }, + { "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence }, #endif }; diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 43182d5d3422..43e653ca76ec 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -259,6 +259,16 @@ void RenderProxy::destroyLayer(DeferredLayerUpdater* layer) { post(task); } +CREATE_BRIDGE0(fence) { + // Intentionally empty + return NULL; +} + +void RenderProxy::fence() { + SETUP_TASK(fence); + postAndWait(task); +} + MethodInvokeRenderTask* RenderProxy::createTask(RunnableMethod method) { // TODO: Consider having a small pool of these to avoid alloc churn return new MethodInvokeRenderTask(method); diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index f1ca534e21d7..fc51d218b1d6 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -78,6 +78,8 @@ public: ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap); ANDROID_API void destroyLayer(DeferredLayerUpdater* layer); + ANDROID_API void fence(); + private: RenderThread& mRenderThread; CanvasContext* mContext; |