创建在显示器上渲染像素的GPU驱动程序需要哪些步骤?基本上只是创建GPU驱动程序的最简单的"你好世界"示例,例如将屏幕变红或只显示单个像素。你从哪里开始?
我想直接破解GPU,不需要任何C或OpenGL抽象或任何其他东西。我使用的是Mac OSX,我想我有英特尔高清i7显卡,所以这些文档看起来很适合:
- 第1卷第1部分:图形核心
- 第1卷第2部分:图形核心MMIO、介质寄存器和;编程环境
- 第1卷第3部分:图形核心-内存接口和命令渲染引擎
- 第1卷第4部分:图形核心-视频编解码器引擎
- 第1卷第5部分:图形核心-Blitter引擎
- 第2卷第1部分:3D/媒体-3D管道
- 第2卷第2部分:3D/媒体-媒体
- 第3卷第1部分:显示寄存器-VGA寄存器
- 第3卷第2部分:显示寄存器-CPU寄存器
- 第3卷第3部分:PCH显示寄存器
- 第4卷第1部分:子系统和核心——共享功能
- 第4卷第2部分:子系统和核心——消息网关、URB、视频运动和IS
Mesa3D项目说有很多开源图形驱动程序,维基百科说英特尔制作这些文档是为了让你可以根据需要编写开源驱动程序,但没有解释如何编写。
我还看到了迈克尔·阿布拉什的《图形编程黑皮书》,这本书解释了很多。
然而,这有点太难同时咬掉。而且似乎没有任何关于如何开始破解GPU驱动程序的信息,这是一个"你好世界"项目。
例如:
- 要学习汇编,只需
brew install nasm
,编写一些汇编,编译并运行它即可打印"helloworld"> - 要学习Arduino,您可以通过USB电缆将Arduino板插入计算机,安装他们的软件,然后将一些C代码直接上传到板上并运行,以显示闪烁的LED灯
如何对显卡进行同样的操作?
hello-world示例不一定要工作(尽管如果工作了,那就太酷了!);即使只是从更高层次/实际意义上概述它需要什么也会有所帮助。如果这在Mac上,甚至在Linux上都是不可能的,那就知道了。但即便如此,问题仍然存在,你从哪里开始编写图形驱动程序
- 步骤1:了解您要瞄准的特定GPU(架构、寄存器和流详细信息)。我担心很多人GPU这些细节可能是专有的,你可能得不到。(但正如你所提到的,在你的情况下,规格是可用的)
- 步骤2:在驱动程序中添加一些调用,这些调用可以从驱动程序中查询寄存器/详细信息
- 步骤3:在驱动程序中添加一些调用以修改寄存器。(更改模式等)
- 步骤4:您可以检查如何在GPU上使用恒定颜色绘制三角形/四边形。尝试实现屏幕清除(功能类似于glClear),通过绘制一个大四边形或2个三角形或1屏幕尺寸加倍的三角形或发送一些清除命令(GPU支持的任何方法)如果绘制三角形或四边形,使用NDC(标准化设备坐标)系统,并且更喜欢在原始窗口系统或NWS中工作(Null开窗系统)。窗口系统负责显示合成或一些后期处理后的输出帧缓冲区。通过原始或NWS,我的意思是直接在屏幕上显示帧缓冲区
- 第5步(大多数都是可选的):实现一些复杂的绘图。这可能涉及对其他绘图模式的支持,例如像素,线条、三角条、三角扇等以及纹理的支撑,照明、转换、与其他窗口系统的交互。对于这一步,您需要学习汇编。但请注意,这是不是x86或arm(CPU)组件,而是GPU组件专门处理SIMD
- 步骤6:实现模具功能。在你的程序中准备一个hello世界的模板。用颜色1清除屏幕。应用模板并再次用颜色2清除屏幕。现在你有你好以颜色1为背景,用颜色2书写的世界
做这一切的座右铭是:你想做这件事。这会很酷。
这样做的动机是:GPU规格可能不可用,GPU组装的学习曲线,图形的复杂性。
我的建议:如果GPU规范(以及汇编)对您可用,我建议实现任何可用API集的子集(例如,打开vg和打开GLES1.1)。欲了解更多关于API套装的信息,请访问khronos网站。