Merge "Fence on draws that are reported"
This commit is contained in:
@ -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;
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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());
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user