以BootAnimation为例说明下surface与layer的关系:
在BootAnimation中
1:在BootAnimation的构造函数中
BootAnimation::BootAnimation(int animType) : Thread(false), mZip(NULL)
{
mAnimationType = animType;
mSession = new SurfaceComposerClient(); //创建SurfaceComposerClient
}
2:在BootAnimation的readyToRun()函数中:
// create the native surface 创建layer的地方
sp control = session()->createSurface(String8(“BootAnimation”),
dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);
3:在createSurface中,注意gbp,这就是surface的producter
sp SurfaceComposerClient::createSurface(
const String8& name,
uint32_t w,
uint32_t h,
PixelFormat format,
uint32_t flags)
{
sp sur;
if (mStatus == NO_ERROR) {
sp handle;
sp gbp;
//最终会在surfaceflinger中创建layer,这个gdb会在layer的onFirstRef里面创建出来
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) {
//这里创建的SurfaceControl是用gdp做参数来创建的
sur = new SurfaceControl(this, handle, gbp);
}
}
return sur;
}
4:然后再来看下SurfaceControl(),主要是赋值
SurfaceControl::SurfaceControl(
const sp& client,
const sp& handle,
const sp& gbp)
//这里的mGraphicBufferProducer会在后面创建surface的时候用到
: mClient(client), mHandle(handle), mGraphicBufferProducer(gbp)
{
}
5:在回到BootAnimation中,有下面的代码:创建surface的地方
sp s = control->getSurface();
6:在SurfaceControl中来看下getSurface做了什么事情
sp SurfaceControl::getSurface() const
{
Mutex::Autolock _l(mLock);
if (mSurfaceData == 0) {
//从这里可以看到surface 的mGraphicBufferProducer就是layer里面创建的GraphicBufferProducer
mSurfaceData = new Surface(mGraphicBufferProducer, false);
}
return mSurfaceData;
}