欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
【轉】Android平臺——Surfaceflinger機制

Android平臺——Surfaceflinger機制

 看到有人在blog上留言,說(shuō)希望看到Surfaceflinger這一部分的內容,最近沒(méi)有時(shí)間寫(xiě)blog,只能先暫時(shí)掐斷Binder機制,寫(xiě)這部分的內容。同樣從幾個(gè)月前的工作筆記中摘錄下來(lái)。也沒(méi)有細細去回顧一下,全當交個(gè)差。忙過(guò)了這段,我一定會(huì )回過(guò)頭來(lái)整理的?。?!
   首先聲明,我們忽略Binder機制的細節。 
    從頭開(kāi)始查找數據的流向,也就是SurfaceFlinger類(lèi)這一層從上層接受數據的過(guò)程,先看一組繼承關(guān)系以便于分析(這個(gè)總略圖將幫你看清數據流向)
MSN的圖片太不清楚了  抑郁!,大家湊和看吧??!

這里LayerBuffer的創(chuàng )建是在SurfaceFlinger中由SurfaceFlinger的友員類(lèi)BClient調用createSurface函數newLayBuffer對象。

數據流向過(guò)程,以opencore解碼舉例:opencore中調用ISufacepostBuff,實(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)SurfacepostBuffer函數(class Surface : public BnSurface),SurfaceLayBaseClient的嵌入類(lèi),而Surface類(lèi)的postBuffer函數未實(shí)現,這會(huì )導致最終調用Surface類(lèi)的繼承類(lèi)SurfaceBufferpostBuffer函數(class SurfaceBuffer : public LayerBaseClient::Surface):

void LayerBuffer::SurfaceBuffer::postBuffer(ssize_t offset)

{

      ……………………………………………..

        owner->postBuffer(offset);

}

SurfaceBuffer類(lèi)是LayBaseClient的繼承類(lèi)LayerBuffer的嵌入類(lèi),SurfaceBufferpostBuffer最終會(huì )調用LayerBufferpostBuffer函數:

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函數(mClientBpSurfaceFlingerClient類(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);

        ………………………………………..

    }

BnSurfaceFlingerClientCREATE_SURFACE的相應將同樣調用CreateSurface函數。但此函數在這個(gè)類(lèi)中未實(shí)現。

        case CREATE_SURFACE: {

            ……………………………………………..

 

            sp<ISurface> s = createSurface(&params, 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函數被調用而newLayerBuffer的對象:

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ì )newLayerBuffer對象

            } 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)生成繼承自

ISurfaceComposerBpSurfaceComposer繼承類(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)理順大家的思路?。?!

 
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Android camera 默認顯示黑白的問(wèn)題
android中的surface
GUI系統之SurfaceFlinger(11)SurfaceComposerClient
Android?圖形系統剖析?(轉)
Android SurfaceFlinger中的Layer,LayerDim,LayerBlur,LayerBuffer
一篇文章看明白 Android 圖形系統 Surface 與 SurfaceFlinger 之間的關(guān)系
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久