图形驱动程序 "hello world" 示例?

Graphics driver "hello world" example?

创建在显示器上渲染像素的 GPU 驱动程序需要哪些步骤?基本上只是创建 GPU 驱动程序的最简单 "hello world" 示例,例如将屏幕变为红色或仅显示单个像素。你从哪里开始?

我想直接破解 GPU,不使用任何 C 或 OpenGL 抽象或其他任何东西。我正在使用 Mac OSX,我想我有 Intel HD i7 显卡,所以 these docs 看起来很合适:

Mesa3D 项目说有许多开源图形驱动程序,维基百科说英特尔制作了这些文档,以便您可以根据需要编写开源驱动程序,但没有解释如何实现。

我也遇到了Michael Abrash's Graphics Programming Black Book,这说明了很多。

然而,一下子咬掉它有点太多了。而且似乎没有关于如何开始破解 GPU 驱动程序的任何信息,一个 "hello world" 项目。

例如:

如何为显卡做同样的事情?

hello world 示例不一定必须有效(尽管如果有效那会很酷!);即使只是概述在 higher-level/practical 意义上需要什么也会有所帮助。如果在 Mac 甚至 Linux 上都不可能,那将是一件好事。但即便如此,问题仍然存在,您从哪里开始编写图形驱动程序?

  • 第 1 步:了解您针对的特定 GPU(架构、寄存器和流详细信息)。恐怕对许多人来说 对于 GPU,这些详细信息可能是专有的,您可能无法获得。 (但正如您提到的,在您的情况下,规格是可用的)
  • 第 2 步:在您的驱动程序中添加一些能够从驱动程序查询寄存器/详细信息的调用。
  • 第 3 步:在您的驱动程序中添加一些调用来修改寄存器。 (更改模式等)
  • 第 4 步:您可以查看如何在 GPU 上以恒定颜色绘制三角形/四边形。尝试实现屏幕清除(功能 类似于 glClear) 通过绘制一个大四边形或 2 个三角形或 1 屏幕尺寸两倍的三角形或发送一些清晰的 命令。 (以 GPU 支持的方式为准)如果你是 绘制三角形或四边形,使用 NDC(归一化设备坐标) 系统,更喜欢在原始窗口系统或 NWS(Null 窗口系统)。窗口系统负责显示 合成或某些 post 处理后的输出帧缓冲区。经过 Raw 或 NWS,我的意思是将帧缓冲区直接显示到屏幕。
  • 第 5 步(大部分内容是可选的):实现一些复杂的绘图。这可能涉及支持其他绘图模式,如像素, 线条、三角条、三角扇等纹理支撑, 照明、转换、与其他窗口系统的交互。 对于此步骤,您将需要学习汇编。但是请注意,这是 不是 x86 或 arm (CPU) 程序集,而是 GPU 程序集 专门处理 SIMD.
  • 步骤 6:实现模板功能。在您的程序中准备一个 hello world 模板。用颜色清除屏幕 1. 应用 模板并再次使用颜色 2 清除屏幕。现在你有你好 以颜色 1 为背景,以颜色 2 书写的世界。

做这一切的动机是:你想做这个。这会很酷。

这样做的动机是:GPU 规格可能不可用、GPU 组装的学习曲线、图形的复杂性。

我的建议:如果您可以使用 GPU 规格(以及程序集),我会建议实施任何可用 API 集的子集(例如打开 vg 和打开 GLES 1.1)。要了解有关这些 API 集的更多信息,请访问 khronos 网站。