Android SurfaceFlinger服務(三) ----- 本地圖層Layer創建

在上一篇文章中,主要分析了Surface的創建過程,對於Layer圖層的創建並沒有深入跟蹤分析。這篇文章將分析Layer圖層的創建,並分析handle gbp這兩個變量的來源。

在SurfaceFlinger中會根據flags的值創建不同的layer。這裏主要以創建普通layer爲例進行分析。

status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
        const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
        sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
{
    // initialize the surfaces
    switch (format) {
    case PIXEL_FORMAT_TRANSPARENT:
    case PIXEL_FORMAT_TRANSLUCENT:
        format = PIXEL_FORMAT_RGBA_8888;
        break;
    case PIXEL_FORMAT_OPAQUE:
        format = PIXEL_FORMAT_RGBX_8888;
        break;
    }

    *outLayer = new Layer(this, client, name, w, h, flags);
    status_t err = (*outLayer)->setBuffers(w, h, format, flags);
    if (err == NO_ERROR) {
        *handle = (*outLayer)->getHandle();
        *gbp = (*outLayer)->getProducer();
    }

    ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
    return err;
}
  • 創建一個Layer對象outLayer
  • 調用Layer對象的getHandle()方法賦值給handle
  • 調用Layer對象的getProducer()方法賦值給gbp

感覺快到源頭了,在來看看Layer類的onFirstRef方法

void Layer::onFirstRef() {
    // Creates a custom BufferQueue for SurfaceFlingerConsumer to use
    sp<IGraphicBufferProducer> producer;
    sp<IGraphicBufferConsumer> consumer;
    BufferQueue::createBufferQueue(&producer, &consumer);
    mProducer = new MonitoredProducer(producer, mFlinger);
    mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName);
    mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
    mSurfaceFlingerConsumer->setContentsChangedListener(this);
    mSurfaceFlingerConsumer->setName(mName);

#ifdef TARGET_DISABLE_TRIPLE_BUFFERING
#warning "disabling triple buffering"
    mSurfaceFlingerConsumer->setDefaultMaxBufferCount(2);
#else
    mSurfaceFlingerConsumer->setDefaultMaxBufferCount(3);
#endif

    const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());
    updateTransformHint(hw);
}
  • 調用BufferQueue::createBufferQueue()方法創建圖像緩衝區隊列
  • 創建產生者對象MonitoredProducer,並賦值給mProducer
  • 創建消費者對象SurfaceFlingerConsumer,並賦值給mSurfaceFlingerConsumer

在來看看Layer的getHandle方法

sp<IBinder> Layer::getHandle() {        
    Mutex::Autolock _l(mLock);

    LOG_ALWAYS_FATAL_IF(mHasSurface,
            "Layer::getHandle() has already been called");

    mHasSurface = true;

    /* 
     * The layer handle is just a BBinder object passed to the client
     * (remote process) -- we don't keep any reference on our side such that
     * the dtor is called when the remote side let go of its reference.
     * 
     * LayerCleaner ensures that mFlinger->onLayerDestroyed() is called for
     * this layer when the handle is destroyed.
     */

    class Handle : public BBinder, public LayerCleaner {
        wp<const Layer> mOwner;
    public:
        Handle(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer)
            : LayerCleaner(flinger, layer), mOwner(layer) {
        }
    }; 

    return new Handle(mFlinger, this);
}
  • 最終返回一個Handle類的binder對象,不知道有什麼用

小結,當客戶端創建Surface的時候,SurfaceFlinger服務端爲會之創建對應的圖層Layer。並且把Layer的圖像緩衝區的生產者接口賦值給Surface對象的成員變量mGraphicBufferProducer。最後,應用層得到了Layer的生產者接口生產數據,在看看Layer的消費者監聽函數。

前面,在Layer的onFirstRef函數中創建了類SurfaceFlingerConsumer對象。該類間接繼承了ConsumerBase消費者基類,所以它要調用setFrameAvailableListener方法去設置監聽器。看看setContentsChangedListener方法的實現

void SurfaceFlingerConsumer::setContentsChangedListener(
        const wp<ContentsChangedListener>& listener) {
    setFrameAvailableListener(listener);
    Mutex::Autolock lock(mMutex);
    mContentsChangedListener = listener;
}
  • 正如上說所說,調用setFrameAvailableListener設置監聽器listener
  • 傳進來的參數listener爲Layer引用,最終調用Layer的onFrameAvailable函數
void Layer::onFrameAvailable(const BufferItem& item) {
    // Add this buffer from our internal queue tracker
    { // Autolock scope
        Mutex::Autolock lock(mQueueItemLock);                                                                                                                                                

        // Reset the frame number tracker when we receive the first buffer after                                                                                                             
        // a frame number reset
        if (item.mFrameNumber == 1) {
            mLastFrameNumberReceived = 0;        
        }

        // Ensure that callbacks are handled in order
        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,                                                                                                               
                    ms2ns(500));
            if (result != NO_ERROR) {   
                ALOGE("[%s] Timed out waiting on callback", mName.string());                                                                                                                 
            }
        }

        mQueueItems.push_back(item);
        android_atomic_inc(&mQueuedFrames);                                                                                                                                                  

        // Wake up any pending callbacks
        mLastFrameNumberReceived = item.mFrameNumber;
        mQueueItemCondition.broadcast();
    }  

    mFlinger->signalLayerUpdate();
}
  • 調用SurfaceFlinger的signalLayerUpdate發送圖層更新信息,看看SurfaceFlinger的處理
  • SurfaceFlinger中調用mEventQueue.invalidate()發送消息,處理函數handleMessageInvalidate
bool SurfaceFlinger::handleMessageInvalidate() {
    ATRACE_CALL();
    return handlePageFlip();
}
  • 通過handlePageFlip把有效緩衝區切換到前臺,等待SurfaceFlinger合成顯示

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章