Discuz! Board

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

Android graphic path

[复制链接]

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
11#
 楼主| 发表于 2016-4-17 12:21:14 | 只看该作者
也是有一對BpGraphicBufferConsumer/BnGraphicBufferConsumer支持他們之間的信息傳輸
下面是BufferQueue中的核心函數分析:

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
12#
 楼主| 发表于 2016-4-17 12:22:10 | 只看该作者
BufferQueue是IGraphicBufferProducer和IGraphicBufferConsumer的具體實現,用戶在請求和SurfaceFlinger連接的過程中會請求SF創建一個Layer,IGraphicBufferProducer就是在這個過程中獲取一個BufferQueue對象,又轉化成IGraphicBufferProducer類對象,是爲了進一步和BufferQueue進行交互,下面是關鍵代碼:
status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
        const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
        sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
{
    // initialize the surfaces
    switch (format) {
    case PIXEL_FORMAT_TRANSPARENT:
    case PIXEL_FORMAT_TRANSLUCENT:
        format = PIXEL_FORMAT_RGBA_8888;
        break;
    case PIXEL_FORMAT_OPAQUE:
        format = PIXEL_FORMAT_RGBX_8888;
        break;
    }

    *outLayer = new Layer(this, client, name, w, h, flags);
    status_t err = (*outLayer)->setBuffers(w, h, format, flags);
    if (err == NO_ERROR) {
        *handle = (*outLayer)->getHandle();
        *gbp = (*outLayer)->getProducer();
    }

    ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
    return err;
}
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
13#
 楼主| 发表于 2016-4-17 12:22:40 | 只看该作者
前面获取Buffer并填充完之后,通过unlockAndroidPost()就可以把画好的buffer发给surfaceflinger去显示出来了。
int Surface::unlockAndPost();
{
    if (mLockedBuffer == 0) {
        ALOGE("Surface::unlockAndPost failed, no locked buffer");
        return INVALID_OPERATION;
    }

    int fd = -1;
    status_t err = mLockedBuffer->unlockAsync(&fd);
    ALOGE_IF(err, "failed unlocking buffer (%p)", mLockedBuffer->handle);

    err = queueBuffer(mLockedBuffer.get(), fd);
    ALOGE_IF(err, "queueBuffer (handle=%p) failed (%s)",
    mLockedBuffer->handle, strerror(-err));

    mPostedBuffer = mLockedBuffer;
    mLockedBuffer = 0;
    return err;
}
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
14#
 楼主| 发表于 2016-4-17 12:22:56 | 只看该作者
If some operations need atomic transaction, just wrap them inside:

SurfaceComposerClient:penGlobalTransaction();
...
SurfaceComposerClient::closeGlobalTransaction();
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
15#
 楼主| 发表于 2016-4-17 12:23:20 | 只看该作者
在BootanimationLoader.cpp文件中,可以看到如下代码,就是按上面的过程画buffer然后发过去的。
这里DecData即为decode完的图片数据。
if ((DecData != NULL || DecData_mini != NULL)&& !mThread->checkExit()) {
    mFlingerSurface->lock(&sBuffer, NULL);//获取backbuffer
    ssize_t bpr = sBuffer.stride * bytesPerPixel(sBuffer.format);
    if(ClearCover_closed &&  DecData_mini != NULL) {
        if(BootAnimData_STATUS & BootAnimData_QMG_MAIN_MINI || BootAnimData_STATUS &
            BootAnimData_QMG_LOOP_MINI) {
            memset(sBuffer.bits, 0,
            sBuffer.stride*sBuffer.height*bytesPerPixel(sBuffer.format));
            for(int32_t h=0; h < header_info_mini.height; h++) {
                if(coverModelName == COVER_MODEL_NAME_TB) { //edge screen mini bootanimation
                    memcpy((char*)sBuffer.bits+(sBuffer.stride*bytesPerPixel(sBuffer.format)*h)+bytesPerPixel(sBuffer.format)*(sBuffer.width-header_info_mini.width), DecData_mini+(header_info_mini.width*bytesPerPixel(sBuffer.format)*h),header_info_mini.width*bytesPerPixel(sBuffer.format));
                }
                else {
                    memcpy((char*)sBuffer.bits+(sBuffer.stride*bytesPerPixel(sBuffer.format)*h),     DecData_mini+(sBuffer.width*bytesPerPixel(sBuffer.format)*h),sBuffer.width*bytesPerPixel(sBuffer.format));
                }
            }
        }
    }else {
        if( DecData != NULL) {
            for(int32_t h=0;h<sBuffer.height;h++){
                memcpy((char*)sBuffer.bits+(sBuffer.stride*bytesPerPixel(sBuffer.format)*h), DecData+(sBuffer.width*bytesPerPixel(sBuffer.format)*h),sBuffer.width*bytesPerPixel(sBuffer.format)) ;
            }
        }
    }
    mFlingerSurface->unlockAndPost();//post过去!!
}
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
16#
 楼主| 发表于 2016-4-17 12:26:25 | 只看该作者
2D rendering path
Skia and hwui
  • For 2D drawing there are two rendering paths
  • hwui: (libwhui.so) hardware accelerated using OpenGL ES 2.0
  • skia: (libskia.so) software render engine
  • hwui is the default
  • Hardware rendering can be disabled per view,window, activity, application or for the whole device
  • Maybe for comparability reasons: hwui produces results different to skia in some (rare) cases
3D rendering path

? An activity can instead create a GLSurfaceView and use OpenGL ES bindings for Java (the
android.opengl.* classes)
? Using either the vendor GPU driver (which must support OpenGL ES 2.0 and optinally 3.0)
? Or as a fall-back, using PixelFlinger, a software GPU that implements OpenGL ES 1.0 only
? Once again, the drawing is rendered to a Surface




本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
17#
 楼主| 发表于 2016-4-17 12:27:18 | 只看该作者
3D rendering path

? An activity can instead create a GLSurfaceView and use OpenGL ES bindings for Java (the
android.opengl.* classes)
? Using either the vendor GPU driver (which must support OpenGL ES 2.0 and optinally 3.0)
? Or as a fall-back, using PixelFlinger, a software GPU that implements OpenGL ES 1.0 only
? Once again, the drawing is rendered to a Surface


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
18#
 楼主| 发表于 2016-4-17 12:30:32 | 只看该作者
Composition

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
19#
 楼主| 发表于 2016-4-17 12:30:52 | 只看该作者
SurfaceFlinger

A high-priority native (C++) daemon, started by init with UID=system
Services connections from activities via Binder interface ISurfaceComposer
Receives activity status from Activity Manager
Receives window status (visibility, Z-order) from Window Manager
Composits multiple Surfaces into a single image
Passes image to one or more displays
Manages buffer allocation, synchronisation
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
20#
 楼主| 发表于 2016-4-17 12:31:34 | 只看该作者
BufferQueue

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-16 02:47 , Processed in 0.016559 second(s), 6 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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