[Exchange Ideas] 在WoW64模式下使用Vulkan进行OpenGL内存映射
Tofloor
poster avatar
加菲不是胖橘
deepin product team
2025-11-18 16:09
Author

2025年11月1日的时候,WineHQ发布了wine 10.18 开发版,里面有一条特性:OpenGL memory mapping using Vulkan in WoW64 mode.

更新日志如下:

  • OpenGL memory mapping using Vulkan in WoW64 mode.
  • Synchronization barriers API.
  • Support for WinRT exceptions.
  • SCSI pass-through in WoW64 mode.
  • Various bug fixes.

核心目标:用 Vulkan 来做 OpenGL 的事

  • OpenGL:一个古老的、广泛支持的图形API。它的设计有些过时,CPU 开销较大(由于状态机模式和驱动层翻译),难以充分发挥现代 GPU(多核、并行处理)的全部性能。
  • Vulkan:一个现代的、低开销的图形API。它提供更精细的控制,能更好地利用多核CPU和现代GPU架构,显著降低驱动开销,从而提升性能和可预测性。

因此,开发者希望既保留应用程序的 OpenGL 代码(为了兼容性或减少重写成本),又能享受到 Vulkan 的性能优势。这就引出了“在 Vulkan 之上实现 OpenGL”的技术。

关键技术:OpenGL 内存映射

这里的“内存映射”并非指简单的文件内存映射,而是指 在 Vulkan 的底层内存和 OpenGL 的抽象对象之间建立桥梁。简单来说:OpenGL 的 API 调用被“翻译”或“映射”为对 Vulkan 对象和内存的操作。

在图形编程中,我们需要在 GPU 上创建和操作各种资源,例如:

  • 顶点缓冲区:存储3D模型的顶点数据。
  • 纹理:存储图像数据。
  • 统一缓冲区:存储着色器使用的常量数据。

差异对比:

  • 在 Vulkan 中:你需要手动地管理这些资源,你申请一块 Vulkan 设备内存 (VkDeviceMemory),然后在其上创建缓冲区 (VkBuffer) 或图像 (VkImage),并自己管理数据的上传和同步。
  • 在 OpenGL 中:你通过如 glGenBuffers(), glBufferData()这样的高级函数来创建和管理这些资源。驱动程序帮你处理底层的内存分配和数据传输。

“内存映射”就是指:当一个 OpenGL 应用程序调用 glBufferData 时,底层的 Vulkan 实现(如 Mesa 的 Zink 驱动或 NVIDIA/AMD 的专有驱动)并不会真的去调用老旧的 OpenGL 驱动,而是会:

  1. 在 Vulkan 端分配一块合适的 VkDeviceMemory 并创建对应的 VkBuffer
  2. 建立一个映射关系,使得上层 OpenGL 的“缓冲区对象”直接对应到底层的 Vulkan VkBuffer
  3. 当 OpenGL 要读写这个缓冲区时,这些操作都会被翻译成对 Vulkan 缓冲区的操作(使用 Vulkan 的命令缓冲区 VkCommandBuffer 来记录操作)。

运行环境:WoW64 模式

WoW64Windows-on-Windows 64-bit 的缩写。它是 Windows 操作系统的一个子系统,允许 32位应用程序64位 Windows 上运行。

为什么需要它?

因为操作系统架构(64位)和应用程序架构(32位)不同。CPU 指令、指针大小、内存寻址方式都不同。WoW64 负责处理这些差异,包括重定向文件系统访问(`C:\Program Files (x86)\` vs `C:\Program Files\`)、注册表访问,以及最重要的——将 32位的系统调用转换成 64位内核能理解的形式

“OpenGL memory mapping using Vulkan in WoW64 mode” 这句话描述的应用程序很可能是一个 32位的 OpenGL 程序,运行在 64位的 Windows系统上。它想要使用一个底层由 Vulkan 实现的 OpenGL 驱动。

所以,“在 WoW64 模式下” 意味着整个复杂的“OpenGL on Vulkan”的映射和翻译过程,都需要通过 WoW64 这个兼容层来进行,这增加了一层额外的复杂性,但对于运行旧的 32 位应用程序至关重要。

分析总结

“在 WoW64 模式下使用 Vulkan 进行 OpenGL 内存映射” 指的是:

一个 32 位的 OpenGL 应用程序,在 64 位的 Windows 系统(通过 WoW64 子系统兼容)上运行时,其图形调用并非由传统的 OpenGL 图形驱动处理,而是由一个特殊的“转换层”或“驱动”来处理。这个转换层将应用程序发出的高级 OpenGL 指令(尤其是关于创建和管理 GPU 内存资源的指令,如创建缓冲区、纹理等)实时地翻译成更低级、更高效的 Vulkan API 调用,并在 Vulkan 层面直接分配和操作真正的 GPU 内存资源。

这样做的最终目的是让这个老的 32 位 OpenGL 程序能够享受到现代 Vulkan 图形接口带来的高性能和低开销,而无需重写应用程序本身的代码。

举个例子:

  • DXVK:一个将 Direct3D 11/10/9 调用转换为 Vulkan 的项目。虽然不是 OpenGL,但原理完全相同,它让许多 Windows 游戏能在 Linux 系统上通过 Wine 高效运行。
  • Zink:Mesa 图形驱动项目的一部分,它是一个在 Vulkan 之上实现 OpenGL 的开源驱动程序。这就是“用 Vulkan 进行 OpenGL 内存映射”的典型代

其实NVIDIA和AMD 公司也在其官方驱动中探索类似技术,用共同的 Vulkan 底层来同时支持 OpenGL 和 Vulkan API,以优化驱动开发和性能。

Reply Favorite View the author
All Replies
kookboy
deepin
2025-11-18 18:59
#1

巧了,我的ollama升级到version 0.12.11,它刚好支持Vulkan加速,不过,貌似我也用不到。tail

Reply View the author
加菲不是胖橘
deepin product team
2025-11-19 13:49
#2
kookboy

巧了,我的ollama升级到version 0.12.11,它刚好支持Vulkan加速,不过,貌似我也用不到。tail

大模型不都是一键部署直接调用,傻瓜式的,哪里还管这些。

Reply View the author