Graphics composition on android 4.3

In Thread "SurfaceFlinger" of android 4.3
01-02 00:00:42.549: D/zzgratest(275): #00  pc 00029924  /system/lib/libsurfaceflinger.so (android::FramebufferSurface::onFrameAvailable()+23)
01-02 00:00:42.549: D/zzgratest(275): #01  pc 0001f1c4  /system/lib/libgui.so (android::BufferQueue::ProxyConsumerListener::onFrameAvailable()+15)
01-02 00:00:42.549: D/zzgratest(275): #02  pc 0001f0bc  /system/lib/libgui.so (android::BufferQueue::queueBuffer(int, android::IGraphicBufferProducer::QueueBufferInput const&, android::IGraphicBufferProducer::QueueBufferOutput*)+851)
01-02 00:00:42.549: D/zzgratest(275): #03  pc 000277dc  /system/lib/libgui.so (android::Surface::queueBuffer(ANativeWindowBuffer*, int)+223)
01-02 00:00:42.549: D/zzgratest(275): #04  pc 0002644a  /system/lib/libgui.so (android::Surface::hook_queueBuffer(ANativeWindow*, ANativeWindowBuffer*, int)+7)
01-02 00:00:42.549: D/zzgratest(275): #05  pc 00003478  /system/vendor/lib/egl/eglsubAndroid.so (SwapBuffers+312)
01-02 00:00:42.549: D/zzgratest(275): #06  pc 00012b0c  /system/vendor/lib/egl/libEGL_adreno.so (qeglDrvAPI_eglSwapBuffers+1544)
01-02 00:00:42.549: D/zzgratest(275): #07  pc 00006c20  /system/vendor/lib/egl/libEGL_adreno.so (eglSwapBuffers+16)
01-02 00:00:42.549: D/zzgratest(275): #08  pc 0000fb1a  /system/lib/libEGL.so (eglSwapBuffers+277)
01-02 00:00:42.549: D/zzgratest(275): #09  pc 0001d8c4  /system/lib/libsurfaceflinger.so (android::DisplayDevice::swapBuffers(android::HWComposer&) const+131)
01-02 00:00:42.549: D/zzgratest(275): #10  pc 0002334e  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::doDisplayComposition(android::sp<android::DisplayDevice const> const&, android::Region const&)+121)
01-02 00:00:42.549: D/zzgratest(275): #11  pc 00025884  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::doComposition()+95)
01-02 00:00:42.549: D/zzgratest(275): #12  pc 00025ae0  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::handleMessageRefresh()+47)
01-02 00:00:42.549: D/zzgratest(275): #13  pc 00026874  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::onMessageReceived(int)+63)
01-02 00:00:42.549: D/zzgratest(275): #14  pc 000150ea  /system/lib/libutils.so (android::Looper::pollInner(int)+381)
01-02 00:00:42.549: D/zzgratest(275): #15  pc 000151ec  /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+91)
01-02 00:00:42.549: D/zzgratest(275): #16  pc 00021cd8  /system/lib/libsurfaceflinger.so (android::MessageQueue::waitMessage()+35)
01-02 00:00:42.549: D/zzgratest(275): #17  pc 00022a68  /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::threadLoop()+1)
01-02 00:00:42.549: D/zzgratest(275): #18  pc 00011a8a  /system/lib/libutils.so (android::Thread::_threadLoop(void*)+213)
01-02 00:00:42.549: D/zzgratest(275): #19  pc 0001157e  /system/lib/libutils.so
01-02 00:00:42.549: D/zzgratest(275): #20  pc 0000cba0  /system/lib/libc.so (__thread_entry+72)
01-02 00:00:42.549: D/zzgratest(275): #21  pc 0000cd1c  /system/lib/libc.so (pthread_create+208)

SurfaceFlinger::doComposition()
-->doDisplayComposition()
//DisplayDevicce::PARTIAL_UPDATES NOTE
-->-->doComposeSurface()
-->-->-->HWComposer::hasGlesComposition()
//by check disp.hasFbComp
-->-->-->-->LayerBase::draw()
-->-->-->-->-->Layer::onDraw()
-->-->-->-->-->-->drawWithOpenGL()
-->-->-->HWComposer::hasHwcComposition()
//by check disp.hasOvComp

-->-->DisplayDevice->swapBuffers(getHwComposer()) // ** in doDisplayComposition
-->-->-->eglSwapBuffers()@libEGL.so  // ** Swap buffers in EGLSurface, holding BufferQueue(USAGE_HW_FB) with consumer FrameBufferSurface. 
-->-->-->-->eglSwapBuffers()@libEGL_adreno.so
-->-->-->-->-->qeglDrvAPI_eglSwapBuffers()@libEGL_adreno.so
-->-->-->-->-->-->SwapBuffers()@eglsubAndroid.so
-->-->-->-->-->-->-->Surface::hook_queueBuffer()
-->-->-->-->-->-->-->-->Surface::queueBuffer()
-->-->-->-->-->-->-->-->-->BufferQueue::queueBuffer()
-->-->-->-->-->-->-->-->-->-->BufferQueue::ProxyConsumerListener::onFrameAvailable()
-->-->-->-->-->-->-->-->-->-->-->FramebufferSurface::onFrameAvailable()
-->-->-->-->-->-->-->-->-->-->-->-->HWComposer::fbPost()
-->-->-->-->-->-->-->-->-->-->-->-->-->framebuffer_device_t::(*post)() = fb_post()
-->-->-->-->-->-->-->-->-->-->-->-->-->-->ioctl(m->framebuffer->fd, FBIOPUT_VSCREENINFO, &m->info) // ** the framebuffer is swapped.

in DisplayDevice::readyToRun, Surface instance will be registered as egl's window surface. Surface includes FramebufferSurface's BufferQueue(USAGE_HW_FB|USAGE_HW_COMPOSER) and inherits from ANativeWindow. in Surface, ANativeWindow's hook function should be called by egl!!! Thus Surface's and its BufferQueue's queuebuffer()s will be called. Then BufferQueue's and its comsumer FramebufferSurface's onframeavailable will be called.

-->DisplayDevice::flip()
-->-->eglSetSwapRectangleANDROID() ************** I think should be 'set' the region.. 

-->-->-->-->DisplayDevice::onSwapBuffersCompleted() // ** callbacked by eglSwpaBuufers
-->-->-->-->-->Signal the Fence

-->postFramebuffer()
-->-->HWComposer::commit()
-->-->-->mHwc->set()  that is hwc_set
-->-->-->-->MDPComp::draw()
-->-->-->-->-->MDPCompSplit::draw()
-->-->-->-->-->-->Overlay::queueBuffer
-->-->-->-->-->-->-->GenericPipe::queueBuffer()
-->-->-->-->-->-->-->-->MdpData::queueBuffer()
-->-->-->-->-->-->-->-->-->MdpData::play()
-->-->-->-->-->-->-->-->-->-->mdp_wrapper::play()
-->-->-->-->-->-->-->-->-->-->-->ioctl(MSMFB_OVERLAY_PLAY) // **start the layerMixer to composite, overlay the HWC_OVERLAY layer to framebuffer.
-->-->-->-->Overlay::displayCommit()
-->-->-->-->->Overlay::displayCommit()
-->-->-->-->->-->mdp_wrapper::displayCommit()
-->-->-->-->->-->-->ioctl(MSMFB_DISPLAY_COMMIT) // ** start DMA, transfer layerMixer output to DSI controller

FramebufferSurface no longer speaks directly to the FB HAL.  Now
everything goes through HWComposer (which may or may not be
connected to a hardware composer).

120// Overrides ConsumerBase: onFrameAvailable(), does not call base class impl.
121void FramebufferSurface: onFrameAvailable() {
122    sp<GraphicBuffer> buf;
123    sp<Fence> acquireFence;
124    status_t err = nextBuffer(buf, acquireFence);
125    if (err != NO_ERROR) {
126        ALOGE("error latching nnext FramebufferSurface buffer: %s (%d)",
127                strerror(-err), err);
128        return;
129    }
130    err = mHwc.fbPost(mDisplayType, acquireFence, buf);
131    if (err != NO_ERROR) {
132        ALOGE("error posting framebuffer: %d", err);
133    }
134}

757int HWComposer::fbPost(int32_t id,
758        const sp<Fence>& acquireFence, const sp<GraphicBuffer>& buffer) {
759    if (mHwc && hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1)) {
760        return setFramebufferTarget(id, acquireFence, buffer);
761    } else {
762        acquireFence->waitForever("HWComposer::fbPost");
763        return mFbDev->post(mFbDev, buffer->handle);  // ** fb_post
764    }
765}

195void DisplayDevice::flip(const Region& dirty) const
196{
197    checkGLErrors();
198
199    EGLDisplay dpy = mDisplay;
200    EGLSurface surface = mSurface;
201
202#ifdef EGL_ANDROID_swap_rectangle
203    if (mFlags & SWAP_RECTANGLE) {
204        const Region newDirty(dirty.intersect(bounds()));
205        const Rect b(newDirty.getBounds());
206        eglSetSwapRectangleANDROID(dpy, surface, // *****
207                b.left, b.top, b.width(), b.height());
208    }
209#endif
210
211    mPageFlipCount++;
212}

Another ANativeWindow with same role of Class Surface(for USAGE_HW_FB) is FrameBufferNativeWindow used by QCom's "GL updater" thread.

GL updater will call this.
GL updater, call FrameBufferNativeWindow::queueBuffer ANativeWindow::dequeueBuffer in eglsubAndroid.so
Thread 3 (LWP 511):
#0 __ioctl () at bionic/libc/arch-arm/syscalls/__ioctl.S:10
#1 0x4028e070 in ioctl (fd=<optimized out>, request=17921) at bionic/libc/bionic/ioctl.c:41
#2 0x400eed38 in fb_post (dev=<optimized out>, buffer=0x4122ff80) at hardware/qcom/display/libgralloc/framebuffer.cpp:129
#3 0x4004ec5a in android::FramebufferNativeWindow::queueBuffer (window=0x4122f578, buffer=<optimized out>) at frameworks/native/libs/ui/FramebufferNativeWindow.cpp:304
#4 0x40423da4 in updater_thread (ptr=0x41230f10) at vendor/qcom/proprietary/gles/adreno200/egl14/src/linux/android/eglUpdaterAndroid.c:451
#5 0x40278eb4 in __thread_entry (func=0x40423c55 <updater_thread>, arg=0x41230f10, tls=0x41041f00) at bionic/libc/bionic/pthread.c:218
#6 0x4027860c in pthread_create (thread_out=0x41230f58, attr=0x402a0154 <gDefaultPthreadAttr>, start_routine=0x40423c55 <updater_thread>, arg=0x41230f10) at bionic/libc/bionic/pthread.c:357
#7 0x00000000 in ?? ()

FramebufferNativeWindow::queueBuffer
274int FramebufferNativeWindow::queueBuffer(ANativeWindow* window,
275        ANativeWindowBuffer* buffer, int fenceFd)
276{
277    FramebufferNativeWindow* self = getSelf(window);
278    Mutex::Autolock _l(self->mutex);
279    framebuffer_device_t* fb = self->fbDev;
280    buffer_handle_t handle = static_cast<NativeBuffer*>(buffer)->handle;
281
282    sp<Fence> fence(new Fence(fenceFd));
283    fence->wait(Fence::TIMEOUT_NEVER);
284
285    const int index = self->mCurrentBufferIndex;
286    int res = fb->post(fb, handle);  // ** fb_post
287    self->front = static_cast<NativeBuffer*>(buffer);
288    self->mNumFreeBuffers++;
289    self->mCondition.broadcast();
290    return res;
291}

SurfaceTextureClient(USAGE_TEXTURE) is used by normal application layers with GPU used buffers.
#05 pc 00014a6b /system/lib/libbinder.so (android::BpBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int)+34)
#06 pc 0001e337 /system/lib/libgui.so 
#07 pc 000217fb /system/lib/libgui.so (android::SurfaceTextureClient::dequeueBuffer(ANativeWindowBuffer**)+86)
#08 pc 000207a7 /system/lib/libgui.so (android::SurfaceTextureClient::hook_dequeueBuffer(ANativeWindow*, ANativeWindowBuffer**)+10)
#09 pc 00002705 /system/lib/egl/eglsubAndroid.so (oeglSwapBuffers something maybe)
#10 pc 000037dd /system/lib/egl/eglsubAndroid.so (eglSwapBuffers something maybe)
#11 pc 00010f90 /system/lib/egl/libEGL_adreno200.so (qeglDrvAPI_eglSwapBuffers+452)
#12 pc 000061bc /system/lib/egl/libEGL_adreno200.so (eglSwapBuffers+16)
#13 pc 0000c6a9 /system/lib/libEGL.so (eglSwapBuffers+164)

[Reference]
http://blog.chinaunix.net/uid-25871104-id-3925025.html
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值