Merge "Fence on draws that are reported"

This commit is contained in:
John Reck
2014-04-08 00:32:15 +00:00
committed by Android (Google) Code Review
7 changed files with 39 additions and 0 deletions

View File

@ -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;

View File

@ -575,6 +575,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.

View File

@ -244,6 +244,11 @@ public class ThreadedRenderer extends HardwareRenderer {
void setName(String name) {
}
@Override
void fence() {
nFence(mNativeProxy);
}
@Override
protected void finalize() throws Throwable {
try {
@ -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);
}

View File

@ -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());

View File

@ -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
};

View File

@ -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);

View File

@ -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;