Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 8|回复: 8
打印 上一主题 下一主题

目标方法已经确定

[复制链接]

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
跳转到指定楼层
楼主
发表于 2016-4-27 00:47:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一步,建立一个影子buffer,
第二步,这个影子buffer如何在可见区?
第三步,使用transform修改copy影子buffer。
回复

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
沙发
 楼主| 发表于 2016-4-27 08:39:26 | 只看该作者
当前有几个显示层,是如下方法确定的::
    const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
    const size_t count = currentLayers.size();
    colorizer.bold(result);
    result.appendFormat("Visible layers (count = %zu)\n", count);
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
板凳
 楼主| 发表于 2016-4-27 08:44:38 | 只看该作者
SurfaceFlinger类有两个类型为State的成员变量mCurrentState和mDrawingState。其中,成员变量mCurrentState用来描述系统下一次要渲染的UI的状态;而mDrawingState用来描述当前正要渲染的UI的状态。
        State类用来描述一个UI状态,它有四个重要的成员变量layersSortedByZ、orientation、orientationType和freezeDisplay。其中,成员变量layersSortedByZ是一个类型为LayerVector的向量,里面保存的系统所包含的Surface,每一个Surface使用一个LayerBase对象来描述,并且它们按照 Z轴顺序来排列;成员变量orientation和orientationType的类型均为uint8_t,它们用来描述屏幕的方向; 成员变量freezeDisplay的类型也是uint8_t,用来描述屏幕是否处于被冻结状态。
        SurfaceFlinger类的成员变量mVisibleLayerSortedByZ是一个类型为sp<LayerBase>的Vector,它是用来保存SurfaceFlinger服务下一次要渲染的、处于可见状态的Surface的,它们是来自SurfaceFlinger类的成员变量mDrawingState所描述的一个State对象的成员变量layersSortedByZ的。
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
地板
 楼主| 发表于 2016-4-27 08:51:28 | 只看该作者
添加和去除一个可视Layer的方法:
void SurfaceFlinger::addClientLayer(const sp<Client>& client,
        const sp<IBinder>& handle,
        const sp<IGraphicBufferProducer>& gbc,
        const sp<Layer>& lbc)
{
    ALOGI("zcfdebug in SurfaceFlinger:: addClientLayer");
    // attach this layer to the client
    client->attachLayer(handle, lbc);

    // add this layer to the current state list
    Mutex::Autolock _l(mStateLock);
    mCurrentState.layersSortedByZ.add(lbc);
    mGraphicBufferProducerList.add(gbc->asBinder());
}

status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
    Mutex::Autolock _l(mStateLock);
    ALOGI("zcfdebug in SurfaceFlinger:: removeLayer");
    ssize_t index = mCurrentState.layersSortedByZ.remove(layer);
    if (index >= 0) {
        mLayersPendingRemoval.push(layer);
        mLayersRemoved = true;
        setTransactionFlags(eTransactionNeeded);
        return NO_ERROR;
    }
    return status_t(index);
}
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
5#
 楼主| 发表于 2016-4-27 09:01:46 | 只看该作者
在每个Layer添加一个mShadow的边梁 ,对于真是的Layer,这个影子指针,指向我们的影子层,而对于影子层本身,这个变量为NULL
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
6#
 楼主| 发表于 2016-4-27 09:38:16 | 只看该作者
Lay.h文件中:添加变量
mShadow和get set方法
//zcfdebug++<<
        sp<Layer> getShadowLayer() const;
        void setShadowLayer(sp<Layer> shadow);
//zcfdebug++>>
再Lay.cpp添加定义:
//zcfdebug++>>
sp<Layer> Layer::getShadowLayer() const {
    return mShadow;
}

void Layer::setShadowLayer(sp<Layer> shadow)
        { mShadow = shadow; }
//zcfdebug>>++
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
7#
 楼主| 发表于 2016-4-27 10:10:55 | 只看该作者
在surface里面添加shadow的生成和销毁的方法:
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)
{
    ALOGI("zcfdebug in SurfaceFlinger::createNormalLayer ");
    // 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);
//zcfdebug++<<
        sp<Layer> shadow = new Layer(this, client, name, w, h, flags);
        err = shadow->setBuffers(w, h, format, flags);
        (*outLayer)->setShadowLayer(shadow);
//zcfdebug++>>
    if (err == NO_ERROR) {
        *handle = (*outLayer)->getHandle();
        *gbp = (*outLayer)->getProducer();
    }

    ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
    return err;
}

status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
        const String8& name, uint32_t w, uint32_t h, uint32_t flags,
        sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
{
    ALOGI("zcfdebug in SurfaceFlinger::createDimLayer ");
    *outLayer = new LayerDim(this, client, name, w, h, flags);

        sp<Layer> shadow = new LayerDim(this, client, name, w, h, flags); //zcfdebug++
        (*outLayer)->setShadowLayer(shadow);        //zcfdebug++
    *handle = (*outLayer)->getHandle();
    *gbp = (*outLayer)->getProducer();
    return NO_ERROR;
}

status_t SurfaceFlinger:nLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
{
    ALOGI("zcfdebug in SurfaceFlinger:: onLayerRemoved");
    // called by the window manager when it wants to remove a Layer
    status_t err = NO_ERROR;
    sp<Layer> l(client->getLayerUser(handle));
    if (l != NULL) {
        err = removeLayer(l);
                err = removeLayer(l->getShadowLayer());        //zcfdebug++
        ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
                "error removing layer=%p (%s)", l.get(), strerror(-err));
    }
    return err;
}

status_t SurfaceFlinger:nLayerDestroyed(const wp<Layer>& layer)
{
    ALOGI("zcfdebug in SurfaceFlinger:: onLayerDestroyed");
    // called by ~LayerCleaner() when all references to the IBinder (handle)
    // are gone
    status_t err = NO_ERROR;
    sp<Layer> l(layer.promote());
    if (l != NULL) {
        err = removeLayer(l);
                err = removeLayer(l->getShadowLayer());        //zcfdebug++
        ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
                "error removing layer=%p (%s)", l.get(), strerror(-err));
    }
    return err;
}
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
8#
 楼主| 发表于 2016-4-27 10:20:19 | 只看该作者
如何从这个layer得到buffer呢?
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
9#
 楼主| 发表于 2016-4-27 14:19:31 | 只看该作者
BufferQueue必须深入理解,才能继续进行下一步
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-15 02:09 , Processed in 0.012709 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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