blink渲染知识12 - 硬件渲染之触发beginframe

ThreadProxy::BeginMainFrame会触发renderlayer tree中各layerpaint.那么谁触发的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相关的一切绘图操作的类。此函数会掉用browserchildcompositor合成出一份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函数会将nativedrawGL操作注册进系统,系统会在合适时间调用。


AwContents.java有函数requestDrawGL会被nativie调用。

->NativeGLDelegate接口的requestDrawGL函数,这个接口实际上是WebViewNativeGLDelegate。,定义在webviewchromium.java

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值