图形驱动程序 "hello world" 示例?
Graphics driver "hello world" example?
创建在显示器上渲染像素的 GPU 驱动程序需要哪些步骤?基本上只是创建 GPU 驱动程序的最简单 "hello world" 示例,例如将屏幕变为红色或仅显示单个像素。你从哪里开始?
我想直接破解 GPU,不使用任何 C 或 OpenGL 抽象或其他任何东西。我正在使用 Mac OSX,我想我有 Intel HD i7 显卡,所以 these docs 看起来很合适:
- Volume 1 Part 1: Graphics Core
- Volume 1 Part 2: Graphics Core – MMIO, Media Registers & Programming Environment
- Volume 1 Part 3: Graphics Core – Memory Interface and Commands Render Engine
- Volume 1 Part 4: Graphics Core – Video Codec Engine
- Volume 1 Part 5: Graphics Core – Blitter Engine
- Volume 2 Part 1: 3D/Media – 3D Pipeline
- Volume 2 Part 2: 3D/Media – Media
- Volume 3 Part 1: Display Registers – VGA Registers
- Volume 3 Part 2: Display Registers – CPU Registers
- Volume 3 Part 3: PCH Display Registers
- Volume 4 Part 1: Subsystem and Cores – Shared Functions
- Volume 4 Part 2: Subsystem and Cores – Message Gateway, URB, Video Motion, and IS
Mesa3D 项目说有许多开源图形驱动程序,维基百科说英特尔制作了这些文档,以便您可以根据需要编写开源驱动程序,但没有解释如何实现。
我也遇到了Michael Abrash's Graphics Programming Black Book,这说明了很多。
然而,一下子咬掉它有点太多了。而且似乎没有关于如何开始破解 GPU 驱动程序的任何信息,一个 "hello world" 项目。
例如:
- 要学习汇编,您可以
brew install nasm
,编写一些汇编,编译并运行它以打印 "hello world"。
- 要学习 Arduino,您可以通过 USB 数据线将 Arduino 开发板插入您的计算机,安装他们的软件,然后将一些 C 代码直接上传到开发板并运行它,以显示闪烁的 LED 灯。
如何为显卡做同样的事情?
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 网站。
创建在显示器上渲染像素的 GPU 驱动程序需要哪些步骤?基本上只是创建 GPU 驱动程序的最简单 "hello world" 示例,例如将屏幕变为红色或仅显示单个像素。你从哪里开始?
我想直接破解 GPU,不使用任何 C 或 OpenGL 抽象或其他任何东西。我正在使用 Mac OSX,我想我有 Intel HD i7 显卡,所以 these docs 看起来很合适:
- Volume 1 Part 1: Graphics Core
- Volume 1 Part 2: Graphics Core – MMIO, Media Registers & Programming Environment
- Volume 1 Part 3: Graphics Core – Memory Interface and Commands Render Engine
- Volume 1 Part 4: Graphics Core – Video Codec Engine
- Volume 1 Part 5: Graphics Core – Blitter Engine
- Volume 2 Part 1: 3D/Media – 3D Pipeline
- Volume 2 Part 2: 3D/Media – Media
- Volume 3 Part 1: Display Registers – VGA Registers
- Volume 3 Part 2: Display Registers – CPU Registers
- Volume 3 Part 3: PCH Display Registers
- Volume 4 Part 1: Subsystem and Cores – Shared Functions
- Volume 4 Part 2: Subsystem and Cores – Message Gateway, URB, Video Motion, and IS
Mesa3D 项目说有许多开源图形驱动程序,维基百科说英特尔制作了这些文档,以便您可以根据需要编写开源驱动程序,但没有解释如何实现。
我也遇到了Michael Abrash's Graphics Programming Black Book,这说明了很多。
然而,一下子咬掉它有点太多了。而且似乎没有关于如何开始破解 GPU 驱动程序的任何信息,一个 "hello world" 项目。
例如:
- 要学习汇编,您可以
brew install nasm
,编写一些汇编,编译并运行它以打印 "hello world"。 - 要学习 Arduino,您可以通过 USB 数据线将 Arduino 开发板插入您的计算机,安装他们的软件,然后将一些 C 代码直接上传到开发板并运行它,以显示闪烁的 LED 灯。
如何为显卡做同样的事情?
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 网站。