status_t SurfaceFlinger::createBufferQueueLayer(const sp<Client>& client, std::string name,
uint32_t w, uint32_t h, uint32_t flags,
LayerMetadata metadata, 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;
}
sp<BufferQueueLayer> layer;
LayerCreationArgs args(this, client, std::move(name), w, h, flags, std::move(metadata));
args.textureName = getNewTexture();
{
// Grab the SF state lock during this since it's the only safe way to access
// RenderEngine when creating a BufferLayerConsumer
// TODO: Check if this lock is still needed here
Mutex::Autolock lock(mStateLock);
layer = getFactory().createBufferQueueLayer(args);
}
status_t err = layer->setDefaultBufferProperties(w, h, format);
if (err == NO_ERROR) {
*handle = layer->getHandle();
*gbp = layer->getProducer();
*outLayer = layer;
}
ALOGE_IF(err, "createBufferQueueLayer() failed (%s)", strerror(-err));
return err;
}
- 如果
format
是 PIXEL_FORMAT_TRANSPARENT
或 PIXEL_FORMAT_TRANSLUCENT
,即有透明度,则使用 PIXEL_FORMAT_RGBA_8888
,如果是不透明的,则使用 PIXEL_FORMAT_RGBX_8888
。
- 调用 DefaultFactory 的
createBufferQueueLayer()
创建 BufferQueueLayer,它的实现是直接调用 BufferQueueLayer 构造函数。然后调用 setDefaultBufferProperties()
设置默认的宽高和像素格式。
- BufferQueueLayer 间接继承 RefBase,在 BufferQueueLayer::onFirstRef() 中创建了 BufferQueue 和生产者消费者。
- 如果没有错误,则设置
handle
、gbp
、outLayer
。