Android SurfaceFlinger服务(二) ----- 本地Surface创建
Android显示系统层次分析
- 应用层,app从WindowManager服务获取图层,渲染图层
- WindowManager管理层,主要管理APP渲染的图层,调用SurfaceFlinger服务, 创建Surface,并将Surface传递给应用
- SurfaceFlinger层,对上层负责Surface的创建,对下层管理各个显示设备, 以及将Surface合成合显示到显示设备上
- 显示驱动层,属于内核层次。SurfaceFlinger最终调用显示驱动显示图像
有了上面的这个整体把握,我们就可以一层一层的去分析整个显示系统源码了。首先,以SurfaceFlinger测试程序resize来看看本地SufaceFlinger的创建和使用。
Surface本地创建
// resize测试程序源码,略有修改,解决编译不通过的问题
int main(void)
{
// set up the thread-pool
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
// create a client to surfaceflinger
sp<SurfaceComposerClient> client = new SurfaceComposerClient();
sp<SurfaceControl> surfaceControl = client->createSurface(String8("resize"), 160, 240, PIXEL_FORMAT_RGB_565, 0);
sp<Surface> surface = surfaceControl->getSurface();
SurfaceComposerClient::openGlobalTransaction();
surfaceControl->setLayer(100000);
SurfaceComposerClient::closeGlobalTransaction();
ANativeWindow_Buffer outBuffer;
surface->lock(&outBuffer, NULL);
ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format);
android_memset16((uint16_t*)outBuffer.bits, 0xF800, bpr*outBuffer.height);
surface->unlockAndPost();
surface->lock(&outBuffer, NULL);
android_memset16((uint16_t*)outBuffer.bits, 0x07E0, bpr*outBuffer.height);
surface->unlockAndPost();
SurfaceComposerClient::openGlobalTransaction();
surfaceControl->setSize(320, 240);
SurfaceComposerClient::closeGlobalTransaction();
IPCThreadState::self()->joinThreadPool();
return 0;
}
- 创建一个SurfaceComposerClient对象
- 调用SurfaceComposerClient对象的createSurface方法,得到一个SurfaceControl的引用
- 调用SurfaceControl的getSurface方法得到一个Surface引用
创建Surface的代码看上去没几行,但涉及的内容远不止看上去的这些。下面来逐一分析,先看看SurfaceComposerClient这个类:
class SurfaceComposerClient : public RefBase
{
friend class Composer;
public:
SurfaceComposerClient();
virtual ~SurfaceComposerClient();
......
// Return the connection of this client
sp<IBinder> connection() const;
......
//! Create a surface
sp<SurfaceControl> createSurface(
const String8& name,// name of the surface
uint32_t w, // width in pixel
uint32_t h, // height in pixel
PixelFormat format, // pixel-format desired
uint32_t flags = 0 // usage flags
);
private:
virtual void onFirstRef();
Composer& getComposer();
mutable Mutex mLock;
status_t mStatus;
sp<ISurfaceComposerClient> mClient;
Composer& mComposer;
};
SurfaceComposerClient继承于RefBase,所以他new一个SurfaceComposerClient对象时。其构造方法和onFirstRef方法被调用。
// 构造函数
SurfaceComposerClient::SurfaceComposerClient()
: mStatus(NO_INIT), mComposer(Composer::getInstance())
{
}
- mStatus状态设置为NO_INIT
- mComposer指向单实例类Composer
void SurfaceComposerClient::onFirstRef() {
sp<ISurfaceComposer> sm(ComposerService::getComposerService());
if (sm != 0) {
sp<ISurfaceComposerClient> conn = sm->createConnection();
if (conn != 0) {
mClient = conn;
mStatus = NO_ERROR;
}
}
}
- 获取ISurfaceComposer代理对象接口。
- 调用ISurfaceComposer接口方法createConnection得到ISurfaceComposerClient代理对象接口。如果获取成功,将ISurfaceComposerClient代理对象接口赋值给mClient,并将mStatus设置为NO_ERROR
创建ISurfaceComposerClientBinder实体对象过程就要去看看ISurfaceComposer的远程实现。正好ISurfaceComposer的远程实现类就是SurfaceFlinger类。
sp<ISurfaceComposerClient> SurfaceFlinger::createConnection()
{
sp<ISurfaceComposerClient> bclient;
sp<Client> client(new Client(this));
status_t err = client->initCheck();
if (err == NO_ERROR) {
bclient = client;
}
return bclient;
}
- new一个Client类对象,构造函数中传入SurfaceFlinger对象指针。
- 调用initCheck函数进行初始化,如果初始化成功就返回该对象引用,否则返回空
- 每次调用createConnection都会创建一个Client类对象,每个对象都是一个远程服务实体,为客户端服务(既mClient方法的实现)。
从SurfaceComposerClient::onFirstRef可以看出,SurfaceComposerClient类里有一个比较重要的成员变量mClient,它指向ISurfaceComposerClient代理对象。
SurfaceComposerClient创建完成了,接下来看看它的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;
}
- 调用mClient(ISurfaceComposerClient)的createSurface方法,然而,这个方法好像并没有返回Surface对象。但是我们得到了另外两个东西,hander和gbp。这些是什么怪物,下篇文章在分析。
- 通过上面获取的两个怪物创建SurfaceControl对象,构造函数中传入有三个参数。this指针(SurfaceComposerClient对象)、handle、gbp。
ISurfaceComposerClient为Binder接口,createSurface方法最终在远程服务中实现。直接看看这个方法的远程实现
// FILE: frameworks/native/services/surfaceflinger/Client.cpp
status_t Client::createSurface(
const String8& name,
uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
sp<IBinder>* handle,
sp<IGraphicBufferProducer>* gbp)
{
/*
* createSurface must be called from the GL thread so that it can
* have access to the GL context.
*/
class MessageCreateLayer : public MessageBase {
SurfaceFlinger* flinger;
Client* client;
sp<IBinder>* handle;
sp<IGraphicBufferProducer>* gbp;
status_t result;
const String8& name;
uint32_t w, h;
PixelFormat format;
uint32_t flags;
public:
MessageCreateLayer(SurfaceFlinger* flinger,
const String8& name, Client* client,
uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
sp<IBinder>* handle,
sp<IGraphicBufferProducer>* gbp)
: flinger(flinger), client(client),
handle(handle), gbp(gbp),
name(name), w(w), h(h), format(format), flags(flags) {
}
status_t getResult() const { return result; }
virtual bool handler() {
result = flinger->createLayer(name, client, w, h, format, flags,
handle, gbp);
return true;
}
};
sp<MessageBase> msg = new MessageCreateLayer(mFlinger.get(),
name, this, w, h, format, flags, handle, gbp);
mFlinger->postMessageSync(msg);
return static_cast<MessageCreateLayer*>( msg.get() )->getResult();
}
- 这个函数啥也没干,只是把工作给转移了。发消息给SurfaceFlinger创建Layer。
- 消息发送与处理不是关心的重点就不展开了。只要知道最后SurfaceFlinger工作线程去执行Message的handler函数就行了
- 看看这个消息的handler函数,还是去调用SurfaceFlinger的createLayer函数去创建Layer,真是绕啊。
status_t SurfaceFlinger::createLayer(
const String8& name,
const sp<Client>& client,
uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp)
{
//ALOGD("createLayer for (%d x %d), name=%s", w, h, name.string());
if (int32_t(w|h) < 0) {
ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
int(w), int(h));
return BAD_VALUE;
}
status_t result = NO_ERROR;
sp<Layer> layer;
switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
case ISurfaceComposerClient::eFXSurfaceNormal:
result = createNormalLayer(client,
name, w, h, flags, format,
handle, gbp, &layer);
break;
case ISurfaceComposerClient::eFXSurfaceDim:
result = createDimLayer(client,
name, w, h, flags,
handle, gbp, &layer);
break;
default:
result = BAD_VALUE;
break;
}
if (result != NO_ERROR) {
return result;
}
result = addClientLayer(client, *handle, *gbp, layer);
if (result != NO_ERROR) {
return result;
}
setTransactionFlags(eTransactionNeeded);
return result;
}
- 根据flags调用不同的函数创建Layer
- 调用addClientLayer将创建的Layer添加到相关的数据结构中
- handler gbp将在创建layer时赋值。关于Layer创建下篇文章在分析,一下子写多了容易糊涂。
在回来看看得到handle gbp以后,用它们来构造一个SurfaceControl对象。
SurfaceControl::SurfaceControl(
const sp<SurfaceComposerClient>& client,
const sp<IBinder>& handle,
const sp<IGraphicBufferProducer>& gbp)
: mClient(client), mHandle(handle), mGraphicBufferProducer(gbp)
{
}
- handle赋值给了成员变量mHandler
- gbp赋值给了成员变量mGraphicBufferProducer, 图像缓冲区生产者接口
然后调用SurfaceControl的getSurface方法得到Surface,看看该方法
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;
}
- 构造函数中主要传入的是mGraphicBufferProducer
Surface::Surface(
const sp<IGraphicBufferProducer>& bufferProducer,
bool controlledByApp)
: mGraphicBufferProducer(bufferProducer),
mGenerationNumber(0)
{
// Initialize the ANativeWindow function pointers.
ANativeWindow::setSwapInterval = hook_setSwapInterval;
ANativeWindow::dequeueBuffer = hook_dequeueBuffer;
ANativeWindow::cancelBuffer = hook_cancelBuffer;
ANativeWindow::queueBuffer = hook_queueBuffer;
ANativeWindow::query = hook_query;
ANativeWindow::perform = hook_perform;
ANativeWindow::dequeueBuffer_DEPRECATED = hook_dequeueBuffer_DEPRECATED;
ANativeWindow::cancelBuffer_DEPRECATED = hook_cancelBuffer_DEPRECATED;
ANativeWindow::lockBuffer_DEPRECATED = hook_lockBuffer_DEPRECATED;
ANativeWindow::queueBuffer_DEPRECATED = hook_queueBuffer_DEPRECATED;
......
}
- Surface在构造函数中最终将gbp赋值给了成员变量mGraphicBufferProducer。
- 每个Surface对象中都含有一个图像缓冲区生产者接口用于画图。
做个总结:
- 客户端首先通过ISurfaceComposer接口创建与SurfaceFlinger的连接,得到ISurfaceComposerClient代理接口。
- 调用ISurfaceComposerClient的createSurface,得到handle和gdp
- 客户端利用SurfaceComposerClient对象指针、handle、gdp创建SurfaceControl对象。
- 最后通过SurfaceControl的getSurface得到surface对象引用