Surfaceflinger简介


分析摘要

Surfaceflinger 介绍

surfaceflinger 接受多个来源的图形显示数据,合成它们并发送至显示设备。如打开应用时常见三层显示,顶部statusbar、底部或侧面导航栏、应用主界面,每层显示单独渲染和更新,这些界面都由 surfaceflinger 合成一个刷新到硬件显示。在显示过程中使用到了 bufferqueue, surfaceflinger 是消费方。比如windowManager 管理的生产方 surface 产生页面,交由 surfaceflinger 进行合成。

bufferqueue 原理

bufferquene

bufferqueue

bufferqueue 分为生产者消费者, 比如应用通过 windowsmanager 分配一个 surface, 需要分配dequeueBuffer 显示空间在上面进行绘图,在图形绘制完成后需要推送 queueBuffer 到 surfaceflinger 进行合成显示。

surfaceflinger 作为消费方, 通过 acquireBuffer() 获取一个要合成的图形, 合成完毕后再releaseBuffer() 将图形释放。

bufferqueue类图关系如下:

bufferquene_UML

bufferqueue UML

surfaceflinger_UML

surfaceflinger UML

ComposerService 为单例模式, 负责与 surfaceflinger 建立 binder 连接代码如下:

class ComposerService : public Singleton<ComposerService>
{
    sp<ISurfaceComposer> mComposerService;
    sp<IBinder::DeathRecipient> mDeathObserver;
    Mutex mLock;

    ComposerService();
    void connectLocked();
    void composerServiceDied();
    friend class Singleton<ComposerService>;
public:

    // Get a connection to the Composer Service.  This will block until
    // a connection is established.
    static sp<ISurfaceComposer> getComposerService();
};

void ComposerService::connectLocked() {
    const String16 name("SurfaceFlinger");
    while (getService(name, &mComposerService) != NO_ERROR) {
        usleep(250000);
    }
    assert(mComposerService != NULL);

    // Create the death listener.
    class DeathObserver : public IBinder::DeathRecipient {
        ComposerService& mComposerService;
        virtual void binderDied(const wp<IBinder>& who) {
            ALOGW("ComposerService remote (surfaceflinger) died [%p]",
                  who.unsafe_get());
            mComposerService.composerServiceDied();
        }
     public:
        DeathObserver(ComposerService& mgr) : mComposerService(mgr) { }
    };

    mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
    mComposerService->asBinder()->linkToDeath(mDeathObserver);
}
/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
    ComposerService& instance = ComposerService::getInstance();
    Mutex::Autolock _l(instance.mLock);
    if (instance.mComposerService == NULL) {
        ComposerService::getInstance().connectLocked();
        assert(instance.mComposerService != NULL);
        ALOGD("ComposerService reconnected");
    }
    return instance.mComposerService;
}

SurfaceComposerClient 则在与 surfaceflinger 建立连接后建立与 Client 的连接,通过 client 调用 createSurface, 然后返回 SurfaceControl

sp<SurfaceControl> SurfaceComposerClient::createSurface(
        const String8& name,
        uint32_t w,
        uint32_t h,
        PixelFormat format,
        uint32_t flags)
{
    sp<SurfaceControl> sur;
    if (mStatus == NO_ERROR) {
        sp<IBinder> handle;
        sp<IGraphicBufferProducer> gbp;
        status_t err = mClient->createSurface(name, w, h, format, flags,
                &handle, &gbp);
        ALOGE_IF(err, "SurfaceComposerClient::createSurface error %s", strerror(-err));
        if (err == NO_ERROR) {
            sur = new SurfaceControl(this, handle, gbp);
        }
    }
    return sur;
}

SurfaceControl 负责这个显示层的控制。

sp<Surface> SurfaceControl::getSurface() const
{
    Mutex::Autolock _l(mLock);
    if (mSurfaceData == 0) {
        // This surface is always consumed by SurfaceFlinger, so the
        // producerControlledByApp value doesn't matter; using false.
        mSurfaceData = new Surface(mGraphicBufferProducer, false);
    }
    return mSurfaceData;
}

通过 SurfaceControl::getSurface(), 得到的真正的显示层,这样之后可以通过 Lock 和 unlock 将 surface 空间分配绘图,再返回给 surfaceflinger. 上面只是 cpp 侧的分析,上层比如 WMS 是 java 层,它的管理也是同底层一样,只不过是有层 JNI 的封装。

layer 显示内存分配

surface 创建后得到 mGraphicBufferProducer, 通过 mGraphicBufferProducer dequeubuffer 在 surfaceflinger 的 BnGraphicBufferProducer dequeuebuffer

int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) {
    status_t result = mGraphicBufferProducer->dequeueBuffer(&buf, &fence, mSwapIntervalZero,
            reqW, reqH, mReqFormat, mReqUsage);

    sp<GraphicBuffer>& gbuf(mSlots[buf].buffer);

    if ((result & IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION) || gbuf == 0) {
        result = mGraphicBufferProducer->requestBuffer(buf, &gbuf);
        if (result != NO_ERROR) {
            ALOGE("dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: %d", result);
            return result;
        }
       *buffer = gbuf.get();
    }

}

在 producer 的 server 侧, new GraphicBuffer 分配一个 GraphicBuffer

if (returnFlags & BUFFER_NEEDS_REALLOCATION) {
    BQ_LOGV("dequeueBuffer: allocating a new buffer for slot %d", *outSlot);
    sp<GraphicBuffer> graphicBuffer = new GraphicBuffer(
            width, height, format, BQ_LAYER_COUNT, usage,
            {mConsumerName.string(), mConsumerName.size()});
}

在 graphicbuffer 中就是分配一个共享内存

GraphicBuffer::GraphicBuffer(uint32_t inWidth, uint32_t inHeight,
        PixelFormat inFormat, uint32_t inLayerCount, uint64_t usage, std::string requestorName)
    : GraphicBuffer()
{
    mInitCheck = initWithSize(inWidth, inHeight, inFormat, inLayerCount,
            usage, std::move(requestorName));
}

status_t GraphicBuffer::initWithSize(uint32_t inWidth, uint32_t inHeight,
        PixelFormat inFormat, uint32_t inLayerCount, uint64_t inUsage,
        std::string requestorName)
{
    GraphicBufferAllocator& allocator = GraphicBufferAllocator::get();
    uint32_t outStride = 0;
    status_t err = allocator.allocate(inWidth, inHeight, inFormat, inLayerCount,
            inUsage, &handle, &outStride, mId,
            std::move(requestorName));
    if (err == NO_ERROR) {
        mBufferMapper.getTransportSize(handle, &mTransportNumFds, &mTransportNumInts);

        width = static_cast<int>(inWidth);
        height = static_cast<int>(inHeight);
        format = inFormat;
        layerCount = inLayerCount;
        usage = inUsage;
        usage_deprecated = int(usage);
        stride = static_cast<int>(outStride);
    }
    return err;
}

GraphicBufferAllocator::get() 使用gralloc进行内存分配,分配完成后,得到bufferIdx 将它发给 client 端也就是 surface 端

virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) {
    Parcel data, reply;
    data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
    data.writeInt32(bufferIdx);
    status_t result =remote()->transact(REQUEST_BUFFER, data, &reply);
    if (result != NO_ERROR) {
        return result;
    }
    bool nonNull = reply.readInt32();
    if (nonNull) {
        *buf = new GraphicBuffer();
        result = reply.read(**buf);
        if(result != NO_ERROR) {
            (*buf).clear();
            return result;
        }
    }
    result = reply.readInt32();
    return result;
}

返回虚拟地址给上层

void* vaddr;
status_t res = backBuffer->lockAsync(
        GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
        newDirtyRegion.bounds(), &vaddr, fenceFd);

surfaceflinger Layer

![surfaceflinger_Layer]

surfaceflinger_Layer

上面创建一个 surface 后, surfaceflinger 对应的是一个 layer, 当上层 layer 调用刷新后, onFrameAvailable 被调用,通知 surfaceflinger 有 layer 更新

void BufferLayer::onFrameAvailable(const BufferItem& item) {
    mFlinger->signalLayerUpdate();
}

[surfaceflinger_Layer]:data:image/jpg;base64,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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM