来源:XDC《Next Generation Display Walls on Linux》
演讲人:Austin Shafer(NVIDIA)
整理日期:2026-10-08
摘要
本报告基于 NVIDIA Austin Shafer 的演讲,分析 Linux 平台上"显示墙"(Display Wall,又称 Video Wall、Media Wall、LED Wall)的技术现状与演进路线。报告梳理了从传统 Xorg "Mosaic" 方案,到 Wayland 迁移带来的困境,再到基于 Vulkan Direct-to-Display(D2D)与 Display Config Server(DCS)的新一代架构,旨在推动显示墙场景从 Windows/Xorg 向现代 Linux 栈迁移。
1. 背景:什么是显示墙
显示墙是由多块显示器或投影仪拼接而成、在视觉上表现为一整块超大屏幕的系统。其关键特征:
- 由多设备驱动:常跨多块 GPU,甚至跨多台物理系统;
- 用途广泛:天文馆、游乐场景点、数字标牌、指挥控制中心等;
- 形状可能不规则或扭曲(需要几何校正/warp);
- 现状是绝大多数部署基于 Windows,NVIDIA 希望改善 Linux 侧的可用性。
典型实例包括天文馆穹顶投影、The Weather Channel 虚拟演播背景、拉斯维加斯 Sphere 球幕等。
2. 显示墙的独特挑战
显示墙与普通终端用户系统差异巨大,核心挑战有:
- 多 GPU,乃至多系统:单墙可能由多台主机、多块 GPU 协同输出;
- 同步呈现(Synchronized presentation) :需专用硬件单元向各系统/GPU 提供同步信号;NVIDIA 的硬件方案为 RTX Pro Sync(即 Framelock / Quadro Sync);
- 客户部署高度定制化,环境各不相同;
- 内核老旧、更新不频繁,部署环境保守;
- 开发者要求对显示的直接控制权:早期显示墙实现诞生于 DRM-KMS 尚不可用的年代,当时一切都必须依赖合成器(compositor),这并非开发者本意。
3. 技术演进路线分析
3.1 历史方案:Xorg 上的 "Mosaic"
NVIDIA "Mosaic" 是显示墙的历史解决方案:
- 将多块显示合并为一个大型虚拟表面,桌面呈现为一块超大 X screen;
- 实现位于 NVIDIA X 驱动(
nvidia_drv.so)内部,是高度 Xorg 专属的方案; - 通过
nvidia-settings和/或xorg.conf配置; - 能满足用户需求,但整个生态正在迁离 X。
#mermaid-svg-xl9pcrH4Ut7tPrvK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xl9pcrH4Ut7tPrvK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xl9pcrH4Ut7tPrvK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xl9pcrH4Ut7tPrvK .error-icon{fill:#552222;}#mermaid-svg-xl9pcrH4Ut7tPrvK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xl9pcrH4Ut7tPrvK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xl9pcrH4Ut7tPrvK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xl9pcrH4Ut7tPrvK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xl9pcrH4Ut7tPrvK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xl9pcrH4Ut7tPrvK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xl9pcrH4Ut7tPrvK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xl9pcrH4Ut7tPrvK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xl9pcrH4Ut7tPrvK .marker.cross{stroke:#333333;}#mermaid-svg-xl9pcrH4Ut7tPrvK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xl9pcrH4Ut7tPrvK p{margin:0;}#mermaid-svg-xl9pcrH4Ut7tPrvK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xl9pcrH4Ut7tPrvK .cluster-label text{fill:#333;}#mermaid-svg-xl9pcrH4Ut7tPrvK .cluster-label span{color:#333;}#mermaid-svg-xl9pcrH4Ut7tPrvK .cluster-label span p{background-color:transparent;}#mermaid-svg-xl9pcrH4Ut7tPrvK .label text,#mermaid-svg-xl9pcrH4Ut7tPrvK span{fill:#333;color:#333;}#mermaid-svg-xl9pcrH4Ut7tPrvK .node rect,#mermaid-svg-xl9pcrH4Ut7tPrvK .node circle,#mermaid-svg-xl9pcrH4Ut7tPrvK .node ellipse,#mermaid-svg-xl9pcrH4Ut7tPrvK .node polygon,#mermaid-svg-xl9pcrH4Ut7tPrvK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xl9pcrH4Ut7tPrvK .rough-node .label text,#mermaid-svg-xl9pcrH4Ut7tPrvK .node .label text,#mermaid-svg-xl9pcrH4Ut7tPrvK .image-shape .label,#mermaid-svg-xl9pcrH4Ut7tPrvK .icon-shape .label{text-anchor:middle;}#mermaid-svg-xl9pcrH4Ut7tPrvK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xl9pcrH4Ut7tPrvK .rough-node .label,#mermaid-svg-xl9pcrH4Ut7tPrvK .node .label,#mermaid-svg-xl9pcrH4Ut7tPrvK .image-shape .label,#mermaid-svg-xl9pcrH4Ut7tPrvK .icon-shape .label{text-align:center;}#mermaid-svg-xl9pcrH4Ut7tPrvK .node.clickable{cursor:pointer;}#mermaid-svg-xl9pcrH4Ut7tPrvK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xl9pcrH4Ut7tPrvK .arrowheadPath{fill:#333333;}#mermaid-svg-xl9pcrH4Ut7tPrvK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xl9pcrH4Ut7tPrvK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xl9pcrH4Ut7tPrvK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xl9pcrH4Ut7tPrvK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xl9pcrH4Ut7tPrvK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xl9pcrH4Ut7tPrvK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xl9pcrH4Ut7tPrvK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xl9pcrH4Ut7tPrvK .cluster text{fill:#333;}#mermaid-svg-xl9pcrH4Ut7tPrvK .cluster span{color:#333;}#mermaid-svg-xl9pcrH4Ut7tPrvK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xl9pcrH4Ut7tPrvK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xl9pcrH4Ut7tPrvK rect.text{fill:none;stroke-width:0;}#mermaid-svg-xl9pcrH4Ut7tPrvK .icon-shape,#mermaid-svg-xl9pcrH4Ut7tPrvK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xl9pcrH4Ut7tPrvK .icon-shape p,#mermaid-svg-xl9pcrH4Ut7tPrvK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xl9pcrH4Ut7tPrvK .icon-shape .label rect,#mermaid-svg-xl9pcrH4Ut7tPrvK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xl9pcrH4Ut7tPrvK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xl9pcrH4Ut7tPrvK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xl9pcrH4Ut7tPrvK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} X11 Application
X server
(nvidia_drv.so)
disp1
disp2
disp3
disp4
3.2 Wayland 能否沿用该设计?
答案是:不能完全照搬。若在 Wayland 上复制 Xorg 思路,会保留其固有缺陷并新增问题:
- 保留 Xorg 的取舍:应用无法直接驱动显示,必须由合成器拥有显示;
- 分发实现更困难 :
- 缺乏跨合成器的统一方式来交付实现;
- 合成器通常不愿内置大量厂商专属显示代码。
既然这套架构本就不是显示墙开发者当初想要的,就不应继续强行沿用。
3.3 当前推荐方案:Vulkan Direct-to-Display(D2D)
Vulkan D2D(VK_KHR_display) 允许 Vulkan 交换链(swapchain)在无窗口系统的情况下直接驱动物理显示,是更契合显示墙需求的 WSI 类型。其优势:
- 应用直接控制显示,呈现过程发生在应用内部;
- 可精细控制多 GPU 使用,自行决定拷贝发生的位置与方式;
- 应用自行执行显示变换(几何校正等);
- 不依赖特定窗口系统。
关键配套扩展:VK_KHR_device_group(多 GPU 协同呈现)、VK_NV_present_barrier(呈现屏障/同步)。
#mermaid-svg-AQUk5S3b6Dfe23QZ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AQUk5S3b6Dfe23QZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AQUk5S3b6Dfe23QZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AQUk5S3b6Dfe23QZ .error-icon{fill:#552222;}#mermaid-svg-AQUk5S3b6Dfe23QZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AQUk5S3b6Dfe23QZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AQUk5S3b6Dfe23QZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AQUk5S3b6Dfe23QZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AQUk5S3b6Dfe23QZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AQUk5S3b6Dfe23QZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AQUk5S3b6Dfe23QZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AQUk5S3b6Dfe23QZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AQUk5S3b6Dfe23QZ .marker.cross{stroke:#333333;}#mermaid-svg-AQUk5S3b6Dfe23QZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AQUk5S3b6Dfe23QZ p{margin:0;}#mermaid-svg-AQUk5S3b6Dfe23QZ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AQUk5S3b6Dfe23QZ .cluster-label text{fill:#333;}#mermaid-svg-AQUk5S3b6Dfe23QZ .cluster-label span{color:#333;}#mermaid-svg-AQUk5S3b6Dfe23QZ .cluster-label span p{background-color:transparent;}#mermaid-svg-AQUk5S3b6Dfe23QZ .label text,#mermaid-svg-AQUk5S3b6Dfe23QZ span{fill:#333;color:#333;}#mermaid-svg-AQUk5S3b6Dfe23QZ .node rect,#mermaid-svg-AQUk5S3b6Dfe23QZ .node circle,#mermaid-svg-AQUk5S3b6Dfe23QZ .node ellipse,#mermaid-svg-AQUk5S3b6Dfe23QZ .node polygon,#mermaid-svg-AQUk5S3b6Dfe23QZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AQUk5S3b6Dfe23QZ .rough-node .label text,#mermaid-svg-AQUk5S3b6Dfe23QZ .node .label text,#mermaid-svg-AQUk5S3b6Dfe23QZ .image-shape .label,#mermaid-svg-AQUk5S3b6Dfe23QZ .icon-shape .label{text-anchor:middle;}#mermaid-svg-AQUk5S3b6Dfe23QZ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AQUk5S3b6Dfe23QZ .rough-node .label,#mermaid-svg-AQUk5S3b6Dfe23QZ .node .label,#mermaid-svg-AQUk5S3b6Dfe23QZ .image-shape .label,#mermaid-svg-AQUk5S3b6Dfe23QZ .icon-shape .label{text-align:center;}#mermaid-svg-AQUk5S3b6Dfe23QZ .node.clickable{cursor:pointer;}#mermaid-svg-AQUk5S3b6Dfe23QZ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AQUk5S3b6Dfe23QZ .arrowheadPath{fill:#333333;}#mermaid-svg-AQUk5S3b6Dfe23QZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AQUk5S3b6Dfe23QZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AQUk5S3b6Dfe23QZ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AQUk5S3b6Dfe23QZ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AQUk5S3b6Dfe23QZ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AQUk5S3b6Dfe23QZ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AQUk5S3b6Dfe23QZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AQUk5S3b6Dfe23QZ .cluster text{fill:#333;}#mermaid-svg-AQUk5S3b6Dfe23QZ .cluster span{color:#333;}#mermaid-svg-AQUk5S3b6Dfe23QZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AQUk5S3b6Dfe23QZ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AQUk5S3b6Dfe23QZ rect.text{fill:none;stroke-width:0;}#mermaid-svg-AQUk5S3b6Dfe23QZ .icon-shape,#mermaid-svg-AQUk5S3b6Dfe23QZ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AQUk5S3b6Dfe23QZ .icon-shape p,#mermaid-svg-AQUk5S3b6Dfe23QZ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AQUk5S3b6Dfe23QZ .icon-shape .label rect,#mermaid-svg-AQUk5S3b6Dfe23QZ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AQUk5S3b6Dfe23QZ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AQUk5S3b6Dfe23QZ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AQUk5S3b6Dfe23QZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} VK_KHR_device_group
VK_NV_present_barrier
Vulkan D2D Application
Vulkan ICD
disp1
disp2
disp3
disp4
3.4 Vulkan D2D 的缺失环节
直接路径虽工作良好,但仍存在问题:
- 每个应用都需自行实现特性校准与配置逻辑 :
- 无集中式配置,需逐应用单独配置;
- 应用未必支持全部特性;
- 多次运行之间缺乏无缝连续性:执行一次 modeset 可能耗时明显,或中断显示特性。
改进思路:引入一个服务进程,由它拥有显示、配置显示特性,并将显示**租借(lease)**出去。
4. 新一代架构:Display Config Server(DCS)
Display Config Server 在 Vulkan D2D 模型之上做增强:由服务器拥有显示,并将其租借给 Vulkan 客户端。
- 配置集中到服务器统一管理;
- Vulkan D2D 应用之间可无缝切换(seamless handoff),改善体验;
- 显示特性的启用在后台完成,应用无需配置或实现任何相关逻辑。
开源地址:https://github.com/NVIDIA/display-config-server
#mermaid-svg-FKPkpiBT319nGFY7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FKPkpiBT319nGFY7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FKPkpiBT319nGFY7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FKPkpiBT319nGFY7 .error-icon{fill:#552222;}#mermaid-svg-FKPkpiBT319nGFY7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FKPkpiBT319nGFY7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FKPkpiBT319nGFY7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FKPkpiBT319nGFY7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FKPkpiBT319nGFY7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FKPkpiBT319nGFY7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FKPkpiBT319nGFY7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FKPkpiBT319nGFY7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FKPkpiBT319nGFY7 .marker.cross{stroke:#333333;}#mermaid-svg-FKPkpiBT319nGFY7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FKPkpiBT319nGFY7 p{margin:0;}#mermaid-svg-FKPkpiBT319nGFY7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FKPkpiBT319nGFY7 .cluster-label text{fill:#333;}#mermaid-svg-FKPkpiBT319nGFY7 .cluster-label span{color:#333;}#mermaid-svg-FKPkpiBT319nGFY7 .cluster-label span p{background-color:transparent;}#mermaid-svg-FKPkpiBT319nGFY7 .label text,#mermaid-svg-FKPkpiBT319nGFY7 span{fill:#333;color:#333;}#mermaid-svg-FKPkpiBT319nGFY7 .node rect,#mermaid-svg-FKPkpiBT319nGFY7 .node circle,#mermaid-svg-FKPkpiBT319nGFY7 .node ellipse,#mermaid-svg-FKPkpiBT319nGFY7 .node polygon,#mermaid-svg-FKPkpiBT319nGFY7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FKPkpiBT319nGFY7 .rough-node .label text,#mermaid-svg-FKPkpiBT319nGFY7 .node .label text,#mermaid-svg-FKPkpiBT319nGFY7 .image-shape .label,#mermaid-svg-FKPkpiBT319nGFY7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-FKPkpiBT319nGFY7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-FKPkpiBT319nGFY7 .rough-node .label,#mermaid-svg-FKPkpiBT319nGFY7 .node .label,#mermaid-svg-FKPkpiBT319nGFY7 .image-shape .label,#mermaid-svg-FKPkpiBT319nGFY7 .icon-shape .label{text-align:center;}#mermaid-svg-FKPkpiBT319nGFY7 .node.clickable{cursor:pointer;}#mermaid-svg-FKPkpiBT319nGFY7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-FKPkpiBT319nGFY7 .arrowheadPath{fill:#333333;}#mermaid-svg-FKPkpiBT319nGFY7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FKPkpiBT319nGFY7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FKPkpiBT319nGFY7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FKPkpiBT319nGFY7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-FKPkpiBT319nGFY7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FKPkpiBT319nGFY7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-FKPkpiBT319nGFY7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FKPkpiBT319nGFY7 .cluster text{fill:#333;}#mermaid-svg-FKPkpiBT319nGFY7 .cluster span{color:#333;}#mermaid-svg-FKPkpiBT319nGFY7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FKPkpiBT319nGFY7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-FKPkpiBT319nGFY7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-FKPkpiBT319nGFY7 .icon-shape,#mermaid-svg-FKPkpiBT319nGFY7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FKPkpiBT319nGFY7 .icon-shape p,#mermaid-svg-FKPkpiBT319nGFY7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-FKPkpiBT319nGFY7 .icon-shape .label rect,#mermaid-svg-FKPkpiBT319nGFY7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FKPkpiBT319nGFY7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-FKPkpiBT319nGFY7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-FKPkpiBT319nGFY7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Lease protocol
DRM lease
Vulkan D2D Applications
Vulkan ICD
Display Config Server
(DRM)
disp1 / disp2 / disp3 / disp4
4.1 单系统部署示例
- 2 块 GPU、8 块显示;
- 运维人员使用
dcs-tool一次性完成配置; - Vulkan 应用在每次运行时获取(acquire)显示;
- 通过
VK_KHR_device_group驱动两块 GPU 上的同步呈现; - 应用经
wp_drm_lease_device_v1协议从 DCS 取得 DRM lease。
#mermaid-svg-3fHGCQ4YGldeqjQa{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3fHGCQ4YGldeqjQa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3fHGCQ4YGldeqjQa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3fHGCQ4YGldeqjQa .error-icon{fill:#552222;}#mermaid-svg-3fHGCQ4YGldeqjQa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3fHGCQ4YGldeqjQa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3fHGCQ4YGldeqjQa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3fHGCQ4YGldeqjQa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3fHGCQ4YGldeqjQa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3fHGCQ4YGldeqjQa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3fHGCQ4YGldeqjQa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3fHGCQ4YGldeqjQa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3fHGCQ4YGldeqjQa .marker.cross{stroke:#333333;}#mermaid-svg-3fHGCQ4YGldeqjQa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3fHGCQ4YGldeqjQa p{margin:0;}#mermaid-svg-3fHGCQ4YGldeqjQa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3fHGCQ4YGldeqjQa .cluster-label text{fill:#333;}#mermaid-svg-3fHGCQ4YGldeqjQa .cluster-label span{color:#333;}#mermaid-svg-3fHGCQ4YGldeqjQa .cluster-label span p{background-color:transparent;}#mermaid-svg-3fHGCQ4YGldeqjQa .label text,#mermaid-svg-3fHGCQ4YGldeqjQa span{fill:#333;color:#333;}#mermaid-svg-3fHGCQ4YGldeqjQa .node rect,#mermaid-svg-3fHGCQ4YGldeqjQa .node circle,#mermaid-svg-3fHGCQ4YGldeqjQa .node ellipse,#mermaid-svg-3fHGCQ4YGldeqjQa .node polygon,#mermaid-svg-3fHGCQ4YGldeqjQa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3fHGCQ4YGldeqjQa .rough-node .label text,#mermaid-svg-3fHGCQ4YGldeqjQa .node .label text,#mermaid-svg-3fHGCQ4YGldeqjQa .image-shape .label,#mermaid-svg-3fHGCQ4YGldeqjQa .icon-shape .label{text-anchor:middle;}#mermaid-svg-3fHGCQ4YGldeqjQa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3fHGCQ4YGldeqjQa .rough-node .label,#mermaid-svg-3fHGCQ4YGldeqjQa .node .label,#mermaid-svg-3fHGCQ4YGldeqjQa .image-shape .label,#mermaid-svg-3fHGCQ4YGldeqjQa .icon-shape .label{text-align:center;}#mermaid-svg-3fHGCQ4YGldeqjQa .node.clickable{cursor:pointer;}#mermaid-svg-3fHGCQ4YGldeqjQa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3fHGCQ4YGldeqjQa .arrowheadPath{fill:#333333;}#mermaid-svg-3fHGCQ4YGldeqjQa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3fHGCQ4YGldeqjQa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3fHGCQ4YGldeqjQa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3fHGCQ4YGldeqjQa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3fHGCQ4YGldeqjQa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3fHGCQ4YGldeqjQa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3fHGCQ4YGldeqjQa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3fHGCQ4YGldeqjQa .cluster text{fill:#333;}#mermaid-svg-3fHGCQ4YGldeqjQa .cluster span{color:#333;}#mermaid-svg-3fHGCQ4YGldeqjQa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3fHGCQ4YGldeqjQa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3fHGCQ4YGldeqjQa rect.text{fill:none;stroke-width:0;}#mermaid-svg-3fHGCQ4YGldeqjQa .icon-shape,#mermaid-svg-3fHGCQ4YGldeqjQa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3fHGCQ4YGldeqjQa .icon-shape p,#mermaid-svg-3fHGCQ4YGldeqjQa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3fHGCQ4YGldeqjQa .icon-shape .label rect,#mermaid-svg-3fHGCQ4YGldeqjQa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3fHGCQ4YGldeqjQa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3fHGCQ4YGldeqjQa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3fHGCQ4YGldeqjQa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Configuration commands
wp_drm_lease_device_v1
DRM lease
dcs-tool
Display Config Server
(DRM)
Vulkan D2D Applications
(Vulkan ICD)
GPU 1 + GPU 2
8 displays
4.2 多系统部署示例
- 每台系统各运行一套 DCS 实例(DCS 1、DCS 2)与各自的 Vulkan 实例;
- 各系统的 DCS 通过 DRM lease 将本机 GPU(如 gpu1/gpu2 与 gpu3/gpu4)租借给本地 Vulkan D2D 应用;
- 多套 DCS + Vulkan 实例协同拼出一面更大的显示墙。
#mermaid-svg-Z41Wxk0nPDgBaqoM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Z41Wxk0nPDgBaqoM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Z41Wxk0nPDgBaqoM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Z41Wxk0nPDgBaqoM .error-icon{fill:#552222;}#mermaid-svg-Z41Wxk0nPDgBaqoM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Z41Wxk0nPDgBaqoM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Z41Wxk0nPDgBaqoM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Z41Wxk0nPDgBaqoM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Z41Wxk0nPDgBaqoM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Z41Wxk0nPDgBaqoM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Z41Wxk0nPDgBaqoM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Z41Wxk0nPDgBaqoM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Z41Wxk0nPDgBaqoM .marker.cross{stroke:#333333;}#mermaid-svg-Z41Wxk0nPDgBaqoM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Z41Wxk0nPDgBaqoM p{margin:0;}#mermaid-svg-Z41Wxk0nPDgBaqoM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Z41Wxk0nPDgBaqoM .cluster-label text{fill:#333;}#mermaid-svg-Z41Wxk0nPDgBaqoM .cluster-label span{color:#333;}#mermaid-svg-Z41Wxk0nPDgBaqoM .cluster-label span p{background-color:transparent;}#mermaid-svg-Z41Wxk0nPDgBaqoM .label text,#mermaid-svg-Z41Wxk0nPDgBaqoM span{fill:#333;color:#333;}#mermaid-svg-Z41Wxk0nPDgBaqoM .node rect,#mermaid-svg-Z41Wxk0nPDgBaqoM .node circle,#mermaid-svg-Z41Wxk0nPDgBaqoM .node ellipse,#mermaid-svg-Z41Wxk0nPDgBaqoM .node polygon,#mermaid-svg-Z41Wxk0nPDgBaqoM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Z41Wxk0nPDgBaqoM .rough-node .label text,#mermaid-svg-Z41Wxk0nPDgBaqoM .node .label text,#mermaid-svg-Z41Wxk0nPDgBaqoM .image-shape .label,#mermaid-svg-Z41Wxk0nPDgBaqoM .icon-shape .label{text-anchor:middle;}#mermaid-svg-Z41Wxk0nPDgBaqoM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Z41Wxk0nPDgBaqoM .rough-node .label,#mermaid-svg-Z41Wxk0nPDgBaqoM .node .label,#mermaid-svg-Z41Wxk0nPDgBaqoM .image-shape .label,#mermaid-svg-Z41Wxk0nPDgBaqoM .icon-shape .label{text-align:center;}#mermaid-svg-Z41Wxk0nPDgBaqoM .node.clickable{cursor:pointer;}#mermaid-svg-Z41Wxk0nPDgBaqoM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Z41Wxk0nPDgBaqoM .arrowheadPath{fill:#333333;}#mermaid-svg-Z41Wxk0nPDgBaqoM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Z41Wxk0nPDgBaqoM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Z41Wxk0nPDgBaqoM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Z41Wxk0nPDgBaqoM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Z41Wxk0nPDgBaqoM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Z41Wxk0nPDgBaqoM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Z41Wxk0nPDgBaqoM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Z41Wxk0nPDgBaqoM .cluster text{fill:#333;}#mermaid-svg-Z41Wxk0nPDgBaqoM .cluster span{color:#333;}#mermaid-svg-Z41Wxk0nPDgBaqoM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Z41Wxk0nPDgBaqoM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Z41Wxk0nPDgBaqoM rect.text{fill:none;stroke-width:0;}#mermaid-svg-Z41Wxk0nPDgBaqoM .icon-shape,#mermaid-svg-Z41Wxk0nPDgBaqoM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Z41Wxk0nPDgBaqoM .icon-shape p,#mermaid-svg-Z41Wxk0nPDgBaqoM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Z41Wxk0nPDgBaqoM .icon-shape .label rect,#mermaid-svg-Z41Wxk0nPDgBaqoM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Z41Wxk0nPDgBaqoM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Z41Wxk0nPDgBaqoM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Z41Wxk0nPDgBaqoM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} System 2
System 1
DRM lease
DRM lease
Vulkan D2D Apps
(Vulkan ICD)
DCS 1 (DRM)
Vulkan D2D Apps
(Vulkan ICD)
DCS 2 (DRM)
gpu1 / gpu2 块
gpu3 / gpu4 块
5. 未来工作
- 支持 DCS 以嵌套(nested)方式运行于 Wayland 合成器之上 :
- 合成器占用一块显示器,将其余显示租借出去;
- DCS 获取这些显示、完成配置后再租借给应用;
- 从而简化系统运维;
- 持续改进 Vulkan D2D API 在显示墙上的呈现能力;
- 总体目标:推动 Linux 在显示墙领域的采用率。
6. 结论
显示墙场景对多 GPU/多系统、硬件级同步、直接显示控制与定制化部署有特殊需求,传统的 Xorg "Mosaic" 方案已随生态迁离 X 而失去可持续性,而简单地将其移植到 Wayland 并不可取。NVIDIA 给出的演进路径是:以 Vulkan Direct-to-Display 作为当前推荐方案,赋予应用对显示的直接控制与精细多 GPU 管理能力;再以开源的 Display Config Server 补齐集中配置与无缝切换等缺失环节。配合 VK_KHR_device_group、VK_NV_present_barrier、RTX Pro Sync 等机制,这一架构有望显著提升 Linux 在显示墙市场的竞争力。
参考链接
- Display Config Server(开源):https://github.com/NVIDIA/display-config-server
- 天文馆系统示例:https://skyskan.com/products/digital-planetarium-systems/
- The Weather Channel 案例:https://www.electrosonic.com/projects/the-weather-channel