|
|
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;
}
|
|