Windows,如何直接渲染到视频扫描输出内存?
Posted
技术标签:
【中文标题】Windows,如何直接渲染到视频扫描输出内存?【英文标题】:Windows, how to render to video scan-out memory directly? 【发布时间】:2019-10-10 02:47:23 【问题描述】:在 Windows 上并最好使用 OpenGL,我可以直接渲染到视频扫描输出内存(显卡的 hdmi 端口)吗?没有缓冲区交换,没有窗口系统 - 直接渲染到缓冲区,像素从中复制到线路。 最终我想实现一个扫描线赛车原型。 但似乎在windows上创建opengl上下文的默认方法涉及创建一个pixelformatdescriptor,据我所知,它只分配一个屏幕外缓冲区(如果需要,则双重缓冲),然后由窗口管理器复制其内容并合成之前以某种方式设置为视频扫描输出内存。
【问题讨论】:
"扫描线赛车原型" 我看不出这需要任何特定的视频输出。您正在构建图像;该过程是否直接写入视频输出与您如何构建该图像无关。 你是说hdmi?我只是为了完整性而添加它,因为我认为它可能是相关的。看看 VR 头显,例如 VIVE,它可以在“扩展模式”下运行,在这种模式下,头显被视为辅助显示器,或“直接模式”。在直接模式下,耳机不会被 Windows 识别/显示为额外的显示和渲染性能更好 - 所以我相信他们能够在这种模式下绕过桌面窗口管理器,在 Windows 7 及更高版本中控制垂直同步和复制数据到读出存储器。在这种模式下连接仍然是通过 hdmi 【参考方案1】:在 Windows 上,最好使用 OpenGL,我可以直接渲染到视频扫描输出内存(显卡的 hdmi 端口)吗?
在 Windows-Vista DWM/Aero 出现之前,您只需创建一个窗口并创建一个缓冲的 OpenGL 上下文。在那个时候,客户区域是实际扫描输出缓冲区的内存视图。
当然,OpenGL 在那时已经没有指定绘制命令的发出时间和它们执行的时间或顺序之间的任何关系;只要遵守“结果看起来就像事情是按照这个顺序执行的一样”规则,任何重新排序都是公平的游戏。所以那时你已经不能实际使用 OpenGL 来比赛光束了。我可能会补充说,你也不能使用 Direct3D。
然而,您可以在 exclusive 模式下使用 DirectDraw,这实际上可以让您直接访问整个扫描输出缓冲区,以一种您实际上可以竞速的方式光束。
但是考虑到现代图形堆栈,即使在这种情况下,光束也不再起作用,因为:
没有缓冲区交换,没有窗口系统 - 直接渲染到缓冲区,像素从那里复制到线路。
好吧,如果您能掌握真正以这种方式工作的古老硬件。这些天都是关于交换链的。例如,在当前一代的 Intel 集成显卡上,即使在文本模式下,如果交换链中没有任何东西,显示器也不会更新。
当然,您仍然可以在中间帧扫描输出时发出交换,从而撕裂帧。 (这也是为什么迄今为止 X.Org 中的双缓冲通常会撕裂动态图片(视频)的部分原因)。
在您的评论中:
以 VR 头显为例,VIVE 可以在“扩展模式”下运行,在这种模式下头显仅被视为辅助显示器,或“直接模式”
这种直接模式没什么特别的。发生了两件事:
HMD 只是隐藏在您可以展开桌面的显示器选择中。
为了访问显示,创建了直接模式图形上下文(使用 DirectX 或 Vulkan),它主要表现为全屏窗口,并带有交换链。
Vulkan(该文本指的是旧版本的 Vulkan,但仍然适用): https://vulkan.lunarg.com/doc/view/1.0.30.0/linux/vkspec.chunked/ch29s03.html
Linux 上的 DRM 租约: https://keithp.com/blogs/DRM-lease/
【讨论】:
Windows 支持 VK_KHR_display 吗? Open GL是否有等价物?我不太明白为什么无法进行光束竞赛?如果我可以直接渲染到扫描输出内存,并且如果我可以使用 glFlush 刷新图形管道,我可以将目标缓冲区划分为例如 4 个水平条,渲染到条 1,flush(),渲染到条 2,冲洗等。 @user1282931:glFlush 并没有像你认为的那样做。它所做的只是告诉 OpenGL 实现您暂时完成了提交,并且您希望它在不远的将来能够工作。 glFinish 意味着刷新并阻塞,直到实现完成执行命令,但时间也不精确。 SwapBuffers 的相似之处在于,它要么立即返回并调用下一个 OpenGL 调用,该调用将修改提交给交换的后备缓冲区(英特尔),要么阻塞直到交换发生(Nvidia)。以上是关于Windows,如何直接渲染到视频扫描输出内存?的主要内容,如果未能解决你的问题,请参考以下文章
安全扫描扫到服务器的SSL存在隐患,建议禁用SSL,启用TLS,这个在WINDOWS和LINUX上,如何操作?