[Internal testing communication] 【treeland + vulkan】treeland的Vulkan渲染器较成熟的架构实现
Tofloor
poster avatar
mozixun
Moderator
6 hours ago
Author

这一轮的treeland Vulkan渲染器重构概要

继 https://bbs.deepin.org.cn/post/299605 之后, 我跟 @zccrs 大佬沟通后, zccrs 大佬指出了更优的方案:

应用/客户端通过Wayland协议递给wl_buffer -> wlroots import 成 OpenGL/Vulkan 的图形纹理 (Texture纹理是什么可以问AI让它形象讲) -> treeland的QtQuick QML画布将图形纹理采样合成画布为 wlroots 用的私货类图像像素 wlr_buffer -> wlroots 将其以Vulkan协议将wlr_buffer递给Linux内核的DRM上屏显示 -> 你看到这个图像

这比我之前实现的优在应用/客户端向treeland的QML画布传递的不是渲染好只有像素信息的Buffer, 而是带着OpenGL/Vulkan说明书的Buffer (即Texture), 因此treeland不再需要跟之前我的实现那样对仅有的像素Buffer进行二次采样成纹理, 因此极大减轻了之前方案中treeland二次采样带来的额外CPU性能开销

这么做很好, 但是需要patch过的wlroots, 让treeland侧的Qt QML画布知道wlroots传来的纹理所有者是谁/生命边界在哪/如何显式同步, wlroots侧补丁在: https://github.com/Better-Deepin-Repo/wlroots-0.19-deepin/commit/c9240cd2d43493bd65bed5692ac90dee42b4a028

目前我已经实现zccrs大佬说的方案, PR链接没动( https://github.com/linuxdeepin/treeland/pull/1032 ), 我直接force-push了重构版本, 实现修好Vulkan边界/显式同步管理后上一版的各类掉帧问题瞬间没了

1.png

效果视频我有时间上传到网上, Better Deepin Repo/玲珑内测源Q群已经有

经过这一轮实现, 我的反思与思考:

  1. 我上一轮学安卓HWUI Vulkan的实现, 学了大致架构但浅尝辄止地没学到精髓: 安卓下的Buffer已经是类似于Texture纹理的形态: 安卓的 Buffer 带 usage flags,比如 CPU/GPU/GLES texture/video encoder 等, 安卓的 Gralloc 可以按硬件最喜欢的 layout/format 分配, 而我只是简单地以为就是传了个绘制好的Buffer像素过去, 导致产生不必要的treeland QML后端必须二次采样的严重开销, 因为虽然这样渲染一帧问题不大, 但是每一帧都需要这样, 开销还是很严重的
  2. 这次zccrs说的实现才是真正学到了安卓HWUI Vulkan渲染流程的精髓, 让treeland成为了能在运行效率与动画效果实现上能对标整个安卓Vulkan系统UI及绘制体系的存在
Reply Favorite View the author
All Replies
avatar
jjcui8595
deepin
an hour ago
#1

like

Reply View the author