overlay 是直接操作显示设备驱动直接绘图的,和sufaceflinger 通过混色后绘制到显示设备上是有区别的,
1. overlay hal对象的获取 // layerbuffer.cpp
LayerBuffer::OverlaySource::OverlaySource()
----> SurfaceFlinger::getOverlayEngine()
---> DisplayHardware::getOverlayEngine()
----> DisplayHardware() 构造函数中获取overlay hal层的module并初始化mOverlayEngine(即overlay的device对象,这样之后通过这个对象就可以操作overlay了)
hw_module_t const* module;
if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) {
overlay_control_open(module, &mOverlayEngine);
}
2. overlay 的使用例如: // layerbuffer.cpp
LayerBuffer::OverlaySource::onVisibilityResolved()
-----> if (mOverlay) {
overlay_control_device_t* overlay_dev = mOverlayDevice;
overlay_dev->setPosition(overlay_dev, mOverlay, x,y,w,h);
// we need to combine the layer orientation and the
// user-requested orientation.
Transform finalTransform(Transform(mLayer.getOrientation()) *
Transform(mOrientation));
overlay_dev->setParameter(overlay_dev, mOverlay,
OVERLAY_TRANSFORM, finalTransform.getOrientation());
overlay_dev->commit(overlay_dev, mOverlay);
}