|
|
上层的程序,处理号surface,会交给surfaceflinger处理。
BufferQueue中间有一个listener:
class ProxyConsumerListener : public BnConsumerListener { public: //省略構造函數 virtual void onFrameAvailable(); /*當一塊buffer可以被消費時,這個函數會被調用,特別注意此時沒有共享鎖的保護*/ virtual voidonBuffersReleased(); /*BufferQueue通知consumer它已經釋放其slot中的一個或多個 GraphicBuffer引用*/ private: wp<ConsumerListener>mConsumerListener;}
[backcolor=rgba(128, 128, 128, 0.0470588)]这个listener会通过surfaceflinger一步一步,最终会调用到FramebufferSurface: nFrameAvailable()
/media/doraemon/works/android/mtk/6735/alps_ok/frameworks/native/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp
// Overrides ConsumerBase: nFrameAvailable(), does not call base class impl.
void FramebufferSurface: nFrameAvailable() {
sp<GraphicBuffer> buf;
sp<Fence> acquireFence;
status_t err = nextBuffer(buf, acquireFence);
if (err != NO_ERROR) {
ALOGE("error latching nnext FramebufferSurface buffer: %s (%d)",
strerror(-err), err);
return;
}
err = mHwc.fbPost(mDisplayType, acquireFence, buf);
if (err != NO_ERROR) {
ALOGE("error posting framebuffer: %d", err);
}
}
|
|