最近在STM32MP157上捣鼓spi显示屏,根据内核的st7735的驱动熟悉drm的使用方式,自己写了个ST7789的驱动,自己编写的程序能调用drm接口实现图像的显示,但是使用qt时,发现qt无法正常使用该驱动。

后续发现是因为qt默认创建XRGB8888格式的framebuffer,传到只支持RGB565的驱动里肯定报错,并且qt还不会去读取驱动的格式支持情况。

然后我在驱动中新增了颜色格式支持XRGB8888(当然在驱动里需要软件转换成RGB565),然后qt程序成功调用了驱动,显示了图像。

但是马上发现XRGB8888转RGB565非常消耗性能(在驱动里又是拷贝又是转换的),造成最大帧率下降(800M的主频不太顶用啊),最后还是将驱动改为仅支持rgb565的,减少额外开销。

这样只能让qt去原生输出rgb565了,有没有办法呢,网上找了很多资料,有说改全局变量的,但是在我这里不奏效,可能是我的qt版本的原因。

最后我尝试从qt源码入手,打算修改格式的默认值,连在线调试的手段都用上了,最后发现颜色格式的默认值好像来自app程序的。

只需要调用其他QT API前用QSurfaceFormat::setDefaultFormat设置一下颜色格式即可:
qt默认颜色格式

但是实际测试发现还是不行,最后还是利用调试,查找颜色格式处理的代码,最后发现是它搞得鬼(下图是已经改好的,原来是没有if判断的):
固定被设置的颜色宽度
无论app给什么值,颜色宽度都被强制设置为8bit,其他地方有一段代码会比较颜色格式,因为被强制设置为了8bit导致比较失败。

解决方法很简单,就像上图,检查一下APP是否设置了位宽,如果有就不强制8位,问题解决!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐