這里LayerBuffer的創(chuàng )建是在SurfaceFlinger中由SurfaceFlinger的友員類(lèi)BClient調用createSurface函數new出LayBuffer對象。
數據流向過(guò)程,以opencore解碼舉例:opencore中調用ISuface的postBuff,實(shí)際ISurface的繼承類(lèi)BpSurface中的postBuffer被調用,通過(guò)Binder機制向同樣是ISurface的繼承類(lèi)的BnSurface請求服務(wù)(通過(guò)發(fā)送POST_BUFFER命令):
virtual void BpSurface ::postBuffer(ssize_t offset)
{
……………………………………………….
remote()->transact(POST_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
}
BnSurface響應相應命令,同樣調用postBuffer函數:
case POST_BUFFER: {
…………………………….
postBuffer(offset);
…………………………….
}
實(shí)際將會(huì )調用BnSurface的繼承類(lèi)Surface的postBuffer函數(class Surface : public BnSurface),Surface是LayBaseClient的嵌入類(lèi),而Surface類(lèi)的postBuffer函數未實(shí)現,這會(huì )導致最終調用Surface類(lèi)的繼承類(lèi)SurfaceBuffer的postBuffer函數(class SurfaceBuffer : public LayerBaseClient::Surface):
void LayerBuffer::SurfaceBuffer::postBuffer(ssize_t offset)
{
……………………………………………..
owner->postBuffer(offset);
}
SurfaceBuffer類(lèi)是LayBaseClient的繼承類(lèi)LayerBuffer的嵌入類(lèi),SurfaceBuffer的postBuffer最終會(huì )調用LayerBuffer的postBuffer函數:
void LayerBuffer::postBuffer(ssize_t offset)
{
…………………………………………….
sp<Buffer> buffer;
if (heap != 0) {
buffer = new Buffer(heap, offset, w, h, hs, vs, f);
if (buffer->getStatus() != NO_ERROR)
buffer.clear();
setBuffer(buffer); //這個(gè)函數將會(huì )置mBuffer指針
invalidate();
}
}
在此函數中將會(huì )創(chuàng )建Buffer類(lèi)用來(lái)存儲數據,LayerBuffer類(lèi)中的mBuffer指針會(huì )指向這個(gè)數據區由BClient利用。
另一方面,關(guān)于LayerBuffer類(lèi)的創(chuàng )建。 在Java層,我們調用Surface_init函數之后,會(huì )對應于android_view_Surface.cpp函數中的Surface_init函數,此函數會(huì )調用SurfaceComposerClient類(lèi)的createSurface函數,
sp<Surface> SurfaceComposerClient::createSurface(
int pid,
DisplayID display,
uint32_t w,
uint32_t h,
PixelFormat format,
uint32_t flags)
{
……………………………………………..
sp<ISurface> surface = mClient->createSurface(&data, pid,
display, w, h, format, flags);
if (surface != 0) {
if (uint32_t(data.token) < NUM_LAYERS_MAX) {
result = new Surface(this, surface, data, w, h, format, flags);
}
}
……………………………………………..
}
紅色代碼行將會(huì )調用BpSurfaceFlingerClient類(lèi)的CreateSurface函數(mClient是BpSurfaceFlingerClient類(lèi)指針)同樣使用Binder機制向BnSurfaceFlingerClient類(lèi)請求服務(wù)(通過(guò)發(fā)送命令CREATE_SURFACE):
virtual sp<ISurface> createSurface( surface_data_t* params,
int pid,
DisplayID display,
uint32_t w,
uint32_t h,
PixelFormat format,
uint32_t flags)
{
………………………………………..
remote()->transact(CREATE_SURFACE, data, &reply);
………………………………………..
}
BnSurfaceFlingerClient對CREATE_SURFACE的相應將同樣調用CreateSurface函數。但此函數在這個(gè)類(lèi)中未實(shí)現。
case CREATE_SURFACE: {
……………………………………………..
sp<ISurface> s = createSurface(¶ms, pid, display, w, h, format, flags);
………………………………………………..
}
因此這個(gè)函數會(huì )由其繼承類(lèi)BClient來(lái)調用,BClient類(lèi)調用CreateSurface時(shí)會(huì )導致其友員類(lèi) SurfaceFlinger類(lèi)的createSurface函數被調用而new出LayerBuffer的對象:
sp<ISurface> BClient::createSurface(
ISurfaceFlingerClient::surface_data_t* params, int pid,
DisplayID display, uint32_t w, uint32_t h, PixelFormat format,
uint32_t flags)
{
//BClient類(lèi)的調用會(huì )調用SurfaceFlinger類(lèi)的createSurface
return mFlinger->createSurface(mId, pid, params, display, w, h, format, flags); //這里從JAVA層來(lái)看,將會(huì )完成對LayerBuffer對象的創(chuàng )建,這個(gè)對象是圖像合成的關(guān)鍵。
}
sp<ISurface> SurfaceFlinger::createSurface(ClientID clientId, int pid,
ISurfaceFlingerClient::surface_data_t* params,
DisplayID d, uint32_t w, uint32_t h, PixelFormat format,
uint32_t flags)
{
……………………………………………….
switch (flags & eFXSurfaceMask) {
case eFXSurfaceNormal:
if (UNLIKELY(flags & ePushBuffers)) {
layer = createPushBuffersSurfaceLocked(c, d, id, w, h, flags); //這個(gè)函數會(huì )new出LayerBuffer對象
} else {
layer = createNormalSurfaceLocked(c, d, id, w, h, format, flags); //Layer對象
}
break;
case eFXSurfaceBlur:
layer = createBlurSurfaceLocked(c, d, id, w, h, flags); //LayerBlur對象
break;
case eFXSurfaceDim:
layer = createDimSurfaceLocked(c, d, id, w, h, flags); //LayerDim對象
break;
}
…………………………………………..
}
在這里我們開(kāi)始進(jìn)入SurfaceFlinger的服務(wù)。
注意: 關(guān)于SurfaceComposerClient類(lèi)的作用,它是用來(lái)產(chǎn)生Binder機制的,舉例:
status_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags)
{
const sp<ISurfaceComposer>& sm(_get_surface_manager());
return sm->freezeDisplay(dpy, flags);
}
const sp<ISurfaceComposer>& _get_surface_manager()
{
if (gSurfaceManager != 0) {
return gSurfaceManager;
}
sp<IBinder> binder;
sp<IServiceManager> sm = defaultServiceManager();
do {
binder = sm->getService(String16("SurfaceFlinger"));
if (binder == 0) {
LOGW("SurfaceFlinger not published, waiting...");
usleep(500000); // 0.5 s
}
} while(binder == 0);
sp<ISurfaceComposer> sc(interface_cast<ISurfaceComposer>(binder));
Mutex::Autolock _l(gLock);
if (gSurfaceManager == 0) {
gSurfaceManager = sc;
}
return gSurfaceManager;
}
這是一個(gè)全局函數,我們在Binder機制中說(shuō)明過(guò),這個(gè)函數的作用就是用來(lái)生成繼承自
ISurfaceComposer的BpSurfaceComposer繼承類(lèi)對象。使得return sm->freezeDisplay(dpy, flags);調用的是BpSurfaceComposer類(lèi)的函數。
SurfaceComposerClient另一個(gè)作用,它還可以調用BpSurfaceFlingerClient類(lèi)的相應函數,同時(shí)也可以設置其他類(lèi)的類(lèi)成員,也就是說(shuō)它是一個(gè)對外的總接口。
這里先寫(xiě)到這兒,Surfaceflinger也是非常復雜,我的工作筆記還有一半多的內容,在貼完工作筆記后,我會(huì )給出一個(gè)總結來(lái)理順大家的思路?。?!
聯(lián)系客服