2024-10-14 13:54:23
在开发中,我为软件渲染器增加了兼容 OpenGL 和 Vulkan 的功能,目标是实时切换渲染器,同时保持渲染效果的同步。原设计中,软件渲染器产生的像素数据(pixel buffer)会通过 glTexSubImage2D 上传到 OpenGL 的纹理,而 Vulkan 则需要先 copy 到 host 可见的 vkImage,再通过 CPU 上传。这种来回操作消耗了大量时间。
幸运的是,Vulkan 与 OpenGL 可以通过扩展实现更高效的纹理共享和同步。首先,通过特定的扩展,我们可以在创建 Vulkan 的 vkImage 和内存时添加支持,生成一个共享的 handle,这个 handle 可以在 OpenGL 中用来创建 Memory Object 并关联到纹理。
同步方面,使用另一个扩展创建 Vulkan 的 Semaphore,并获取 handle,然后在 OpenGL 端导入这个 handle,用于在 Vulkan 的队列提交中进行信号和等待操作,确保两边的数据一致性。这样,即使在 Vulkan 渲染器下,也能实现稳定接近 60fps 的帧率(之前通过 CPU 中间处理低于 50fps)。
整个过程的核心代码在 Github 的