ThreadProxy::BeginMainFrame会触发renderlayer tree中各layer的paint.那么谁触发的BeginMainFrame?
ThreadProxy::ScheduledActionSendBeginMainFrame
-> Proxy::MainThreadTaskRunner()->PostTask(
FROM_HERE,
base::Bind(&ThreadProxy::BeginMainFrame,
硬件渲染触发的callstack:
注意,下面的callstack来自4.3机子:
#0 cc::ThreadProxy::ScheduledActionSendBeginMainFrame(this=0x641def38) at ../../cc/trees/thread_proxy.cc:691
#1 0x6078da14 in cc::Scheduler::ProcessScheduledActions
//这里只是向webcore申请paint操作。
(this=this@entry=0x64993cb8) at../../cc/scheduler/scheduler.cc:665
#2 0x6078df92 in cc::Scheduler::BeginImplFrame
//此函数不光要向webcore线程发出申请一paint操作。还要自己构造合成一个frame.
(this=this@entry=0x64993cb8, args=...) at../../cc/scheduler/scheduler.cc:520
#3 0x6078e304 in cc::Scheduler::BeginFrame(this=0x64993cb8, args=...) at ../../cc/scheduler/scheduler.cc:426
#4 0x6079795e in cc::LayerTreeHostImpl::BeginFrame(this=<optimized out>, args=...) at../../cc/trees/layer_tree_host_impl.cc:1408
#5 0x60b97c16 incontent::SynchronousCompositorOutputSurface::InvokeComposite(this=this@entry=0x642f4868, transform=..., viewport=..., clip=...,viewport_rect_for_tile_priority=...,
transform_for_tile_priority=..., hardware_draw=<optimizedout>, hardware_draw@entry=true) at../../content/browser/android/in_process/synchronous_compositor_output_surface.cc:227
#6 0x60b97e5e incontent::SynchronousCompositorOutputSurface::DemandDrawHw(this=0x642f4868, surface_size=..., transform=..., viewport=...,clip=..., viewport_rect_for_tile_priority=...,
transform_for_tile_priority=...) at../../content/browser/android/in_process/synchronous_compositor_output_surface.cc:178
#7 0x60b977b0 in content::SynchronousCompositorImpl::DemandDrawHw
//这个是同步compositor.此函数就会返回一个compositorframe.
this=0x6498e6c0, surface_size=..., transform=..., viewport=...,clip=..., viewport_rect_for_tile_priority=...,transform_for_tile_priority=...)
at../../content/browser/android/in_process/synchronous_compositor_impl.cc:139
#8 0x607f6cf0 inandroid_webview::BrowserViewRenderer::OnDrawHardware
注意,这个函数被调用的前提是我们是4.3,4.4系统,因为这个系统上,ui线程会调用drawGl,所以可以让他调用BrowserViewRender来合成一个compositorframe. 在5.0系统上,应该又真正的ui线程去合成compositorframe,而不应该在drawGl执行时干这件事情。
BrowserViewRender据说就是处理webview相关的一切绘图操作的类。此函数会掉用browser的childcompositor合成出一份compositorframe并保存到draw_gl_input里面。供后续使用,后续先要commit他。
(this=this@entry=0x6498e540)at ../../android_webview/browser/browser_view_renderer.cc:304
#9 0x60e5a5f8 in android_webview::AwContents::DrawGL(this=0x6498e458, draw_info=0xbec91240) at../../android_webview/native/aw_contents.cc:429//这个是我们注册给系统的drawGL函数。在4.4,4.3上是ui线程调用,在androidL上是一个独立的系统的render线程调用。
#10 0x60f5e816 in draw_gl_normal(this=0x641ffeb0, data=<optimized out>, what=<optimizedout>) at../../third_party/android_plat_support/draw_gl_functor.cpp:139
#11 android::(anonymous namespace)::DrawGLFunctor::operator()(this=0x641ffeb0, what=<optimized out>, data=<optimizedout>) at../../third_party/android_plat_support/draw_gl_functor.cpp:60//怀疑这个函数被注册到系统,底层。
#12 0x40bf40b2 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so
#13 0x40be80b0 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so
#14 0x40be686c in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so
#15 0x40be6798 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so
#16 0x40beee90 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libhwui.so
#17 0x4024caf6 in ?? () from/tmp/tshao-adb-gdb-libs/system/lib/libandroid_runtime.so
#18 0x408dec50 in dvmPlatformInvoke () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
#19 0x4090eed2 in dvmCallJNIMethod(unsigned int const*, JValue*,Method const*, Thread*) () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
#20 0x408e8064 in dvmJitToInterpNoChain () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
#21 0x408e8064 in dvmJitToInterpNoChain () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
关闭tab时,硬件渲染引发的callstack:
#0 cc::ThreadProxy::ScheduledActionSendBeginMainFrame(this=0x641def38) at ../../cc/trees/thread_proxy.cc:691
#1 0x6078da14 in cc::Scheduler::ProcessScheduledActions(this=0x64993cb8) at ../../cc/scheduler/scheduler.cc:665
#2 0x6078daca in cc::Scheduler::SetNeedsCommit (this=<optimizedout>) at ../../cc/scheduler/scheduler.cc:169
#3 0x607a2928 in cc::ThreadProxy::SetNeedsCommitOnImplThread(this=0x641def38) at ../../cc/trees/thread_proxy.cc:400
#4 0x6079ba64 in cc::LayerTreeHostImpl::ReleaseGL(this=0x64964948) at ../../cc/trees/layer_tree_host_impl.cc:2200
#5 0x6076a270 in cc::OutputSurface::ReleaseGL (this=<optimizedout>) at ../../cc/output/output_surface.cc:170
#6 0x60b97afe incontent::SynchronousCompositorOutputSurface::ReleaseHwDraw(this=<optimized out>) at../../content/browser/android/in_process/synchronous_compositor_output_surface.cc:157
#7 0x60b979c8 incontent::SynchronousCompositorImpl::ReleaseHwDraw (this=<optimizedout>) at../../content/browser/android/in_process/synchronous_compositor_impl.cc:114
#8 0x607f6682 inandroid_webview::BrowserViewRenderer::ReleaseHardware(this=this@entry=0x6498e540) at../../android_webview/browser/browser_view_renderer.cc:543
#9 0x60e5a82c inandroid_webview::AwContents::OnDetachedFromWindow (this=0x6498e458,env=<optimized out>, obj=<optimized out>) at../../android_webview/native/aw_contents.cc:956
#10 0x408dec50 in dvmPlatformInvoke () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
#11 0x4090eed2 in dvmCallJNIMethod(unsigned int const*, JValue*,Method const*, Thread*) () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
#12 0x409108be in dvmResolveNativeMethod(unsigned int const*,JValue*, Method const*, Thread*) () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
#13 0x408e8064 in dvmJitToInterpNoChain () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
#14 0x408e8064 in dvmJitToInterpNoChain () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
Backtrace stopped: previous frame identical to this frame (corruptstack?)
还可能出现的软件渲染触发的callstack:
#0 cc::ThreadProxy::ScheduledActionSendBeginMainFrame(this=0x641def38) at ../../cc/trees/thread_proxy.cc:691
#1 0x6078da14 in cc::Scheduler::ProcessScheduledActions(this=this@entry=0x64993cb8) at ../../cc/scheduler/scheduler.cc:665
#2 0x6078df92 in cc::Scheduler::BeginImplFrame(this=this@entry=0x64993cb8, args=...) at../../cc/scheduler/scheduler.cc:520
#3 0x6078e304 in cc::Scheduler::BeginFrame (this=0x64993cb8,args=...) at ../../cc/scheduler/scheduler.cc:426
#4 0x6079795e in cc::LayerTreeHostImpl::BeginFrame(this=<optimized out>, args=...) at../../cc/trees/layer_tree_host_impl.cc:1408
#5 0x60b97c16 incontent::SynchronousCompositorOutputSurface::InvokeComposite(this=this@entry=0x642f4868, transform=..., viewport=..., clip=...,viewport_rect_for_tile_priority=...,
transform_for_tile_priority=..., hardware_draw=<optimizedout>, hardware_draw@entry=false) at../../content/browser/android/in_process/synchronous_compositor_output_surface.cc:227
#6 0x60b97f28 incontent::SynchronousCompositorOutputSurface::DemandDrawSw(this=0x642f4868, canvas=<optimized out>) at../../content/browser/android/in_process/synchronous_compositor_output_surface.cc:202
#7 0x60b97800 in content::SynchronousCompositorImpl::DemandDrawSw(this=0x6498e6c0, canvas=<optimized out>) at../../content/browser/android/in_process/synchronous_compositor_impl.cc:155
#8 0x607f6a14 inandroid_webview::BrowserViewRenderer::CompositeSW(this=this@entry=0x6498e540, canvas=canvas@entry=0xbec912c8) at../../android_webview/browser/browser_view_renderer.cc:846
#9 0x607f7796 inandroid_webview::BrowserViewRenderer::ForceFakeCompositeSW(this=this@entry=0x6498e540) at../../android_webview/browser/browser_view_renderer.cc:840
#10 0x607f7914 inandroid_webview::BrowserViewRenderer::FallbackTickFired(this=0x6498e540) at../../android_webview/browser/browser_view_renderer.cc:826
#11 0x607f5afa in Run (object=<optimized out>,this=0xbec91420) at ../../base/bind_internal.h:134
#12 MakeItSo (a1=<optimized out>, runnable=...) at../../base/bind_internal.h:871
#13 base::internal::Invoker<1,base::internal::BindState<base::internal::RunnableAdapter<void(android_webview::BrowserViewRenderer::*)()>, void(android_webview::BrowserViewRenderer*), void (base::internal::Unret
ainedWrapper<android_webview::BrowserViewRenderer>)>,void(android_webview::BrowserViewRenderer*)>::Run(base::internal::BindStateBase*)(base=<optimized out>) at ../../base/bind_internal.h:1169
#14 0x6055cdf2 in Run (this=<optimized out>) at../../base/callback.h:401
#15 base::CancelableCallback<void ()>::Forward()(this=<optimized out>) at ../../base/cancelable_callback.h:106
#16 0x6055ce38 in Run (object=<optimized out>,this=0xbec91438) at ../../base/bind_internal.h:134
#17 MakeItSo (weak_ptr=..., runnable=...) at../../base/bind_internal.h:882
#18 base::internal::Invoker<1,base::internal::BindState<base::internal::RunnableAdapter<void(base::CancelableCallback<void ()>::*)()>, void(base::CancelableCallback<void ()>*), void(base::WeakPtr<base::Cancela
bleCallback<void ()> >)>, void(base::CancelableCallback<void()>*)>::Run(base::internal::BindStateBase*) (base=0x64215488)at ../../base/bind_internal.h:1169
#19 0x6100e280 in Run (this=0xbec91550) at../../base/callback.h:401
#20 base::MessageLoop::RunTask (this=this@entry=0x5c9415f8,pending_task=...) at ../../base/message_loop/message_loop.cc:464
#21 0x6100e338 in base::MessageLoop::DeferOrRunPendingTask(this=this@entry=0x5c9415f8, pending_task=...) at../../base/message_loop/message_loop.cc:482
#22 0x6100ebac in base::MessageLoop::DoDelayedWork(this=0x5c9415f8, next_delayed_work_time=0xbec91598) at../../base/message_loop/message_loop.cc:634
#23 0x60ff1b46 in DoRunLoopOnce(delayed_scheduled_time_ticks=34676111993, native_delegate=<optimizedout>, obj=0x4330001d, env=0x41f93cf0) at../../base/message_loop/message_pump_android.cc:60
#24Java_com_jetpack_dolphin_webkit_org_chromium_base_SystemMessageHandler_nativeDoRunLoopOnce(env=0x41f93cf0, jcaller=0x4330001d,messagePumpDelegateNative=<optimized out>,
delayedScheduledTimeTicks=34676111993) atgen/base/jni/SystemMessageHandler_jni.h:42
#25 0x408dec50 in dvmPlatformInvoke () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
#26 0x4090eed2 in dvmCallJNIMethod(unsigned int const*, JValue*,Method const*, Thread*) () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
#27 0x408e8064 in dvmJitToInterpNoChain () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
#28 0x408e8064 in dvmJitToInterpNoChain () from/tmp/tshao-adb-gdb-libs/system/lib/libdvm.so
看看DrawGLFunctor的使用和调用。
Native层和java层都有DrawGLFunctor他们相互关联。
native的在third_party/android_plat_support目录下。
DrawGLFunctor.java类的requestDrawGL函数会将native的drawGL操作注册进系统,系统会在合适时间调用。
AwContents.java有函数requestDrawGL会被nativie调用。
->NativeGLDelegate接口的requestDrawGL函数,这个接口实际上是WebViewNativeGLDelegate。,定义在webviewchromium.java