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