图形驱动程序"hello world"的例子?

Lan*_*ard 19 c opengl graphics assembly

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

我想直接破解GPU,没有任何C或OpenGL抽象或任何​​.我使用的是Mac OSX,我认为我有Intel HD i7显卡,所以这些文档似乎很合适:

Mesa3D项目表示有许多开源图形驱动程序,维基百科说英特尔会生成这些文档,以便您可以根据需要编写开源驱动程序,但不解释如何.

我还遇到了Michael Abrash的图形编程黑皮书,它解释了很多.

然而,这有点太多了.似乎没有任何关于如何开始攻击GPU驱动程序的信息,这是一个"hello world"项目.

例如:

  • 要学习汇编,你可以只brew install nasm编写一些汇编,编译并运行它来打印"hello world".
  • 要学习Arduino,您可以通过USB线将Arduino板插入计算机,安装软件,并将一些C代码直接上传到电路板并运行,以显示闪烁的LED灯.

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

你好世界的例子不一定非常有效(尽管如果它确实会很酷!); 即使仅仅概述一下更高层次/实际意义上的内容也会有所帮助.如果在Mac上,甚至在Linux上都无法实现,那就不错了.但即使这样,问题仍然存在,你从哪里开始编写图形驱动程序?

Moh*_*ain 14

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

完成这一切的动机是:你想要做到这一点.这将很酷.

实现这一目标的动机是:GPU规范可能不可用,GPU组装的学习曲线,图形的复杂性.

我的建议:如果您可以使用GPU规范(以及汇编),我建议实现任何可用API集的实现子集(打开vg并打开GLES 1.1).要了解有关这些API集的更多信息,请访问khronos网站.

  • 查询许多寄存器不需要汇编知识.只查询内部(指定为)寄存器(来自寄存器库)需要汇编知识,但您几乎不需要它.这一步只是为了确保我们能够读取(GPU)设备.这将确保您了解GPU如何在总线上连接等.您无需手动连接设备,但是可以使用驱动程序的模拟器,它可能有助于(消除所有风险)来掌握设备理解更好. (3认同)
  • 一旦您能够读/写寄存器,您需要学习有关如何清除屏幕的文档(输出FBO).根据GPU的不同,这种方法可以通过绘制四边形屏幕尺寸,发送清晰的指令,在屏幕上绘制两个三角形或绘制一个可以占用整个屏幕的大三角形.(base = screen_width*2和height = screen_height)是最小的这样的三角形.一旦您能够清除屏幕或在屏幕上以所需颜色绘制一个三角形,您就可以进行任何所需的3D绘图. (3认同)
  • 这取决于您的GPU在总线上的放置方式。您的GPU寄存器将相应地映射到您的CPU地址空间中。我从未编写过MAC驱动程序,但是在Linux中,如果设备具有逻辑地址,则可以在驱动程序中将地址取消引用为易失性指针,然后直接进行写操作。否则,在Linux中可以正确选择'outp'或'write'或将设备地址映射到虚拟地址,然后从GPU基址写入所需的寄存器偏移量。Mac是类似的内核体系结构,应该以这种方式工作,但是您需要探索更多有关如何用MAC编写基本驱动程序的信息。 (2认同)