Surfaceflinger中图像绘制流程

本文详细介绍了Android系统中Surfaceflinger如何消费App产生的图像数据,从layer创建过程开始,涉及SurfaceFlinger、Layer、BufferQueue、GLConsumer等多个组件的角色和交互,最终通过HWComposer将图像显示到屏幕上。
摘要由CSDN通过智能技术生成
App产生图像数据是由Surfaceflinger消费的,下面走一下图像的消费过程。
activity中的surface对应到服务端就是layer,从layer创建过程开始


1.创建过程
SurfaceFlinger.cpp
SurfaceFlinger.createLayer() {
     //普通类型的layer,支持多个类型
      SurfaceFlinger.createNormalLayer()
}

SurfaceFlinger::createNormalLayer(){
    //创建跟app对应的layer, app的surface中主要就是操作 (*outLayer)->getBufferQueue()了
    *outLayer = new Layer(this, client, name, w, h, flags);
    status_t err = (*outLayer)->setBuffers(w, h, format, flags);
    *handle = (*outLayer)->getHandle();
   //app端就是用的这个BufferQueue
     *gbp = (*outLayer)->getBufferQueue();
}

layer.cpp
当new Layer()后第一次sp<>,会调用onFirstRef()
void Layer::onFirstRef() {
    //创建了bufferqueue   
    //class SurfaceTextureLayer : public BufferQueue   继承了BufferQueue

    mBufferQueue = new SurfaceTextureLayer(mFlinger);

   //BufferQueue的消费者,mTextureName:是纹理id
    mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(mBufferQueue, mTextureName);
    //自己监听了是否数据构造好了
    mSurfaceFlingerConsumer->setFrameAvailableListener(this);
   }

SurfaceFlingerConsumer.cpp
 class SurfaceFlingerConsumer : public GLConsumer
    //构造函数 把参数传递给基类
    //TEXTURE_EXTERNAL = GL_TEXTURE_EXTERNAL_OES  特定类型的纹理
    SurfaceFlingerConsumer(const sp<BufferQueue>& bq, uint32_t tex)
        : GLConsumer(bq, tex, GLConsumer::TEXTURE_EXTERNAL, false)
    {}

GLConsumer.cpp
    class GLConsumer : public ConsumerBase {
    //看名称就是用opengl了,保存了纹理名称,BufferQueue又给了基类
   // mTexName 绘制的纹理,app端的图像
    GLConsumer::GLConsumer(const sp<IGraphicBufferConsumer>& bq, uint32_t tex,
        uint32_t texTarget, bool useFenceSync, bool isControlledByApp) :
        ConsumerBase(bq, isControlledByApp), mTexName(tex),

Consumernase.cpp
    class ConsumerBase : public virtual RefBase,
        protected ConsumerListener

   ConsumerBase::ConsumerBase(const sp<IGraphicBufferConsumer>& bufferQue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值