SurfaceFlinger代码笔记
drawLayers是做client合成,合成完以后的buffer会放在RenderSurface里
FrameBufferSurface里的buffer是通过setClientTarget给到HWC的(HWC应该给client合成的buffer留了一个slot)
Output.cpp这个文件非常关键,代表着具体一个Display的操作
drawLayers第三个参数是个
renderengine::ExternalTexture,是
dequeueRenderBuffer的时候从
mRenderSurface->dequeueBuffer中获取到的,drawLayers就是把最终的东西放到这个buffer里
具体代码都在Output.cpp里
而
setClientTarget就是被
FramebufferSurface::advanceFrame调用的
以下函数是重头戏:
void Output::present(const compositionengine::CompositionRefreshArgs& refreshArgs) {
ATRACE_FORMAT("%s for %s", __func__, mNamePlusId.c_str());
ALOGV(__FUNCTION__);
updateColorProfile(refreshArgs);
updateCompositionState(refreshArgs);
planComposition();
writeCompositionState(refreshArgs);
setColorTransform(refreshArgs);
beginFrame();
GpuCompositionResult result;
const bool predictCompositionStrategy = canPredictCompositionStrategy(refreshArgs);
if (predictCompositionStrategy) {
result = prepareFrameAsync();
} else {
prepareFrame();
}
devOptRepaintFlash(refreshArgs);
finishFrame(std::move(result));
postFramebuffer();
renderCachedSets(refreshArgs);
}