0

程序员有什么办法直接将数据写入视频内存?我知道操作系统对此非常严格,但是有些类型的应用程序(如视频播放器或电脑游戏)可以将其数据直接写入视频内存。如何将数据直接写入视频内存?

我知道这里有一些众所周知的库(例如OpenGL)。但它们毕竟只是普通的图书馆,它们和我和你编写的程序之间没有本质的区别。

+0

在一些ARM板上,您可以通过'/ dev/fb0'文件直接访问framebuffer。具有开源驱动程序的现代Linux系统可让您通过libdrm&co访问视频内存。 – fsasm

+0

确实存在一个**基本**区别:它们随附自己的*驱动程序*/*内核模块*。 –

回答

1

我知道这里有一些众所周知的库(例如OpenGL)。但它们毕竟只是普通的图书馆,它们和我和你编写的程序之间没有本质的区别。

哦,他们是相当不同于“正常的图书馆”。

以OpenGL为例。其中一部分是您加载的DLL或SO。但其中的一部分就是所谓的“驱动程序”或“图形驱动程序”。这根本不是一个“正常的图书馆”;它基本上是操作系统的一部分。它基本上是操作系统制造商之外的其他人编写的一部分。

系统为驱动程序定义接口,硬件制造商提供适合该接口的驱动程序库。但这不是普通用户能够提供的,也不是通过安装自己的图形驱动程序来运行大多数游戏。

该驱动程序的目的是为操作系统的OS和客户端提供统一的图形硬件接口。不同的硬件是不同的,但每个OS驱动程序导出相同的接口(或多或少),这允许客户端代码不必知道硬件的细节。

防止客户端代码从打破系统。如果你使GPU崩溃(由于它是处理器,现在你可以做这件事),所以有人必须处理这个问题。操作系统处理CPU故障,而现在的图形驱动程序/操作系统也会处理GPU故障。但为了做到这一点,它必须站在你和硬件之间。

在大多数操作系统上,直接任意访问视频内存是不允许的。不适用于任何本身不是图形驱动程序的程序。许多低级API(如OpenGL)允许您映射某些内存分配,以便您可以访问它们。但是,与给人GPU内存指针完全不同,毕竟,不能保证映射的指针实际指向GPU内存。

哦,他们不让你映射纹理或帧缓冲区,因为他们希望保持硬件纹理格式的细节实现定义。

+0

我相信你应该更加重视答案的最后部分:问题是没有访问内存(任何驱动程序都可以这样做),问题是硬件接口很复杂。有许多种缓冲区(着色器,纹理,帧缓冲区,...),GART,视频模式以及最后但并非最不重要的事实是“显示器”是共享资源,只要操作系统需要刷新,它就会覆盖帧缓冲区。 –

+0

感谢您的微小全面回应;-)但让我知道如果我正确地说“如果一个显卡制造商想要实际支持OpenGL,它必须提供一个OpenGL兼容的驱动程序(一个运行OpenGL命令)”。还有最后一件事:我仍然不知道哪些API(它们中有多少)在哪里可以让程序员做出神奇的图形作品。我想每个操作系统都有自己的方式来完成这个任务,对吧?例如,据我所知,Windows有DirectX。其他操作系统呢? –