该系列文章总目录链接与各部分简介: Android Qcom Display学习(零)
本章主要是基于高通平台上dump出GPU渲染 or GPU合成 or HWC合成的GraphicBuffer的数据。
起初是在B站上看到这么一个视频,能dump出每个Layer的数据显示系统原理以及图形系统调试,看到Android Framework中自带了
Layer::dump的方法,但是在Android S上并没有,在Google的历史中找到移植时发现Android版本的更替Layer.cpp中的改动很大
https://android.googlesource.com/platform/frameworks/native/+/e64a79c/services/surfaceflinger/Layer.cpp
https://android.googlesource.com/platform/frameworks/native/+/e64a79c/services/surfaceflinger/SurfaceFlinger.cpp
于是自己写了个dump的方法,结果发现在Layer.cpp中通过getBuffer()拿到的数据一直是空的,又想通过layerSettings.source.buffer.buffer来获取GraphicBuffer,最终找到了frameworks/native/libs/renderengine/skia/SkiaGLRenderEngine.cpp中SkiaGLRenderEngine::drawLayers
拿到dump出的GraphicBuffer在7YUV和YUVIEW上发现只有星点都不是正常画面,在RenderSurface::queueBuffer中dump GPU合成Layers的GraphicBuffer,发现也是星点,当然这个也是预料之中,Layers的数据都不对合成后的肯定也有问题,
看了这个大佬的博客 Android 图像显示系统 – 导出图层数据的方法介绍(dump GraphicBuffer raw data)
网上搜了一大堆,才知道合成方式有GPU和HWC,可通过adb shell dumpsys SurfaceFlinger > SurfaceFlinger.txt
在BufferStateLayer::setBuffer中添加dump HWC中的GraphicBuffer,发现还是不正常的,后来在高通文档里发现高通本来就有dump Layers的方法,于是就想看看有没有问题