Discuz! Board
标题:
目标方法已经确定
[打印本页]
作者:
zangcf
时间:
2016-4-27 00:47
标题:
目标方法已经确定
第一步,建立一个影子buffer,
第二步,这个影子buffer如何在可见区?
第三步,使用transform修改copy影子buffer。
作者:
zangcf
时间:
2016-4-27 08:39
当前有几个显示层,是如下方法确定的::
const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
const size_t count = currentLayers.size();
colorizer.bold(result);
result.appendFormat("Visible layers (count = %zu)\n", count);
作者:
zangcf
时间:
2016-4-27 08:44
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的。
作者:
zangcf
时间:
2016-4-27 08:51
添加和去除一个可视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);
}
作者:
zangcf
时间:
2016-4-27 09:01
在每个Layer添加一个mShadow的边梁 ,对于真是的Layer,这个影子指针,指向我们的影子层,而对于影子层本身,这个变量为NULL
作者:
zangcf
时间:
2016-4-27 09:38
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>>++
作者:
zangcf
时间:
2016-4-27 10:10
在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;
}
作者:
zangcf
时间:
2016-4-27 10:20
如何从这个layer得到buffer呢?
作者:
zangcf
时间:
2016-4-27 14:19
BufferQueue必须深入理解,才能继续进行下一步
欢迎光临 Discuz! Board (http://47.89.242.157:9000/bbs/discuz/)
Powered by Discuz! X3.2