Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: zangcf
打印 上一主题 下一主题

Android graphic path

[复制链接]

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
31#
 楼主| 发表于 2016-4-17 12:43:32 | 只看该作者
So now EGL can swap to the FrameBufferSurface, because the EGLSurface is the provider end of the same BufferQueue which hosts FrameBufferSurface. The layer represented by the frame buffer target is tracked by DisplayDevice::framebufferTarget, ANativeWindow and ANativeWindowBuffer is the interface used by EGL to access the buffer allocated in SurfaceFlinger. Basically flow is:
swap to DisplayDevice::mSurface, DisplayDevice::mNativeWindow influenced too -> BufferQueue::queueBuffer -> FramebufferSurface:nFrameAvailable -> HWComposer::fbPost -> HWComposer::setFramebufferTarget -> get framebuffer target fram handle parameter -> disp.framebufferTarget.handle = disp.fbTargetHandle;

To get clear understanding of the process and the role, reference to this picture:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
32#
 楼主| 发表于 2016-4-17 12:44:59 | 只看该作者
Summary

1.Surface dequeueBuffer eventually works on BuffferQueue in SF, Surface is provider, SurfaceFlingerConsumer is consumer
2.GraphicBuffer in allocated for Surface to draw.
3.Surface queueBuffer eventually works on BufferQueue in SF, Layer:nFrameAvailable called.
4.SurfaceFlingerConsumer::updateTexImage bind EGLImage as texture
5.Layer:nDraw draws to the BufferQueue of FramebufferSurface, here egl is provider, FramebufferSurface is consumer
6.FramebufferSurface:nFrameAvailable -> HWComposer::fbPost -> HWComposer::setFramebufferTarget
7.All layers prepared, sent to HWC
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
33#
 楼主| 发表于 2016-4-17 12:47:14 | 只看该作者
preComposition();預先准備“合成物“就是客戶端那邊傳來的UI信息的buffer;
rebuildLayerStacks();在每一個screen上重建可見區域;
setUpHWComposer();初始化一個硬件容器;
doDebugFlashRegions();這個函數一般進去就返回來了;
doComposition();實質的合成過程,並且合成完的BUFFER由opengl es處理,處理之後由postFramebuffer()送到display上顯示;

這裏重點研究doComposition()
void SurfaceFlinger::doComposition() {
    ATRACE_CALL();
    const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
    for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
        const sp<DisplayDevice>& hw(mDisplays[dpy]);
        if (hw->isDisplayOn()) {
            // transform the dirty region into this screen's coordinate space
            const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));

            // repaint the framebuffer (if needed)
            doDisplayComposition(hw, dirtyRegion);

            hw->dirtyRegion.clear();
            hw->flip(hw->swapRegion);
            hw->swapRegion.clear();
        }
        // inform the h/w that we're done compositing
        hw->compositionComplete();
    }
    postFramebuffer();
}

doDisplayComposition(hw, dirtyRegion);負責渲染的核心函數。
它的调用过程是:
doDisplayComposition-> doComposeSurfaces->draw->onDraw->drawWithOpenGL
一直走到OPENGL層Composite。
之后就是调用hw->flip()函数交换backBuffer和frontBuffer(?)。

之后postFramebuffer()就会调用hwc.commit(),把需要显示的发给底层fb驱动去显示了。。
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
34#
 楼主| 发表于 2016-4-17 12:48:41 | 只看该作者
Composition


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
35#
 楼主| 发表于 2016-4-17 12:50:03 | 只看该作者
Layer

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
36#
 楼主| 发表于 2016-4-17 12:50:58 | 只看该作者
Layer在createSurface()创建Surface的时候被一起创建并保存。在使用SurfaceComposerClient::createSurface()创建surface的时候,需要传名字,显示的宽度/高通,而且需要显示的format,最后还有一个参数是flags,这个是显示窗口显示状态的(dim,blur等等)。以下是Layer的几种显示状态

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
37#
 楼主| 发表于 2016-4-17 12:51:35 | 只看该作者
本帖最后由 zangcf 于 2016-4-17 12:53 编辑

Layer对应普通的窗口
LayerDim 会使他后面的窗口产生一个变暗的透明效果
LayerBlur在LayerDim的基础上,背景会产生模糊的效果创建Layer
默认地,创建普通的窗口Surface,在SurfaceFlinger中会创建Layer类,如果想创建LayerDim或LayerBlur,应用程序需要在绑定View之前设置一下窗口的标志位。
创建LayerDim效果:
@Override  protected void onCreate(Bundle icicle) {      // Be sure to call the super class.      super.onCreate(icicle);      // Have the system blur any windows behind this one.      getWindow().setFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND,              WindowManager.LayoutParams.FLAG_DIM_BEHIND);      ......      setContentView(......);  }  


创建LayerBlur效果:
@Override  protected void onCreate(Bundle icicle) {      // Be sure to call the super class.      super.onCreate(icicle);      // Have the system blur any windows behind this one.      getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,              WindowManager.LayoutParams.FLAG_BLUR_BEHIND);      ......      setContentView(......);  }  


这样设置的,最后在status_t SurfaceFlinger::createLayer()函数中,会根据相应的flag的值创建不同的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){    ...    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;    }    ...}
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
38#
 楼主| 发表于 2016-4-17 12:54:32 | 只看该作者
所以,比如mSession->createSurface(String8(“samsungAniDim”), dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565, 0x00020000),是对应eFXSurfaceDim!!

http://blog.csdn.net/DroidPhone/article/details/6002237

改了一点代码,可以让SurfaceFlinger显示当前的layer个数,显示flag等:
01-11 03:13:15.580  2123  2123 D SurfaceFlinger:   numHwLayers=3, flags=0000000001-11 03:13:15.580  2123  2123 D SurfaceFlinger:     type   |  handle  | hint | flag | tr | blnd |   format    |     source crop (l,t,r,b)      |          frame         | name 01-11 03:13:15.580  2123  2123 D SurfaceFlinger: -----------+----------+------+------+----+------+-------------+--------------------------------+------------------------+------01-11 03:13:15.580  2123  2123 D SurfaceFlinger:        HWC | b5c44520 | 0000 | 0000 | 00 | 0100 | RGBA_8888   |    0.0,   33.0,  800.0, 1280.0 |    0,   33,  800, 1280 | com.samsung.android.FactoryTestLauncher/com.samsung.android.FactoryTestLauncher.ui.Main01-11 03:13:15.580  2123  2123 D SurfaceFlinger:        HWC | b5c44200 | 0000 | 0000 | 00 | 0105 | RGBA_8888   |    0.0,    0.0,  800.0,   33.0 |    0,    0,  800,   33 | StatusBar01-11 03:13:15.580  2123  2123 D SurfaceFlinger:  FB TARGET | b606d340 | 0000 | 0000 | 00 | 0105 | RGBA_8888   |    0.0,    0.0,  800.0, 1280.0 |    0,    0,  800, 1280 | HWC_FRAMEBUFFER_TARGET
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
39#
 楼主| 发表于 2016-4-17 12:57:37 | 只看该作者
HWComposer
prepare() and set()


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
40#
 楼主| 发表于 2016-4-17 12:59:50 | 只看该作者
vsync
Displays



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Comsenz Inc.

GMT+8, 2025-12-16 09:29 , Processed in 0.020628 second(s), 5 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表