Драйвер графического драйвера "привет мир"?

Каковы шаги, необходимые для создания драйвера графического процессора, отображающего пиксели на дисплее? В основном просто самый простой пример "привет мир" для создания драйвера графического процессора, например, поворот экрана красным или просто отображение одного пикселя. С чего начать?

Я хотел бы напрямую взломать графический процессор без какой-либо абстракции C или OpenGL или любого из них. Я использую Mac OSX, и я думаю, что у меня есть графическая карта Intel HD i7, поэтому эти документы выглядели как подходящие:

В проекте Mesa3D говорится, что есть несколько графических драйверов с открытым исходным кодом, и в Википедии говорится, что Intel выпускает эти документы, чтобы вы могли писать драйвер с открытым исходным кодом, если хотите, но не объясняете, как это сделать.

Я также натолкнулся на "Черная книга с графическим программированием Майкла Абраша" , что объясняет многое.

Однако это немного, чтобы откусить всех сразу. И, похоже, нет никакой информации о том, как начать взломать драйвер GPU, проект "привет мир".

Например:

  • Чтобы изучить сборку, вы можете просто brew install nasm, написать сборку, скомпилировать и запустить ее для печати "hello world".
  • Чтобы узнать Arduino, вы можете подключить плату Arduino к компьютеру через USB-кабель, установить программное обеспечение и загрузить код C непосредственно на плату и запустить его, чтобы показать мигающий светодиод.

Как вы делаете то же самое для видеокарты?

Символ hello world не обязательно должен работать (хотя это было бы здорово, если бы оно было!); даже просто изложение того, что потребуется для более высокого уровня/практического смысла, было бы полезно. Если это невозможно на Mac или даже на Linux, это было бы хорошо знать. Но даже тогда вопрос остается, где вы начинаете писать графический драйвер?

Ответы

Ответ 1

  • Шаг 1. Понимайте конкретный GPU, на который вы нацеливаетесь (информация о архитектуре, регистре и потоке). Я боюсь, что многие из GPU эти данные могут быть проприетарными, и вы не можете их получить. (Но, как вы упомянули, в вашем случае доступны спецификации)
  • Шаг 2. Добавьте несколько вызовов в свой драйвер, которые могут запрашивать регистры/данные из драйвера.
  • Шаг 3: добавьте несколько вызовов в ваш драйвер, чтобы изменить регистры. (Режим изменения и т.д.)
  • Шаг 4. Вы можете проверить, как рисовать треугольник/квадрат на вашем графическом процессоре с постоянным цветом. Попробуйте реализовать прозрачность экрана (функциональность подобно glClear), рисуя большой квадрат или 2 треугольника или 1 треугольник размерности double экрана или отправку некоторого ясного команда. (какой бы способ не поддерживался GPU) Если вы рисуя треугольник или квадроцикл, используйте NDC (нормализованная координата устройства) системы и предпочитают работать в Raw windowing system или NWS (Null оконная система). Система отображения отвечает за отображение ваш выходной фрейм-буфер после компоновки или некоторая пост-обработка. От Raw или NWS, я имею в виду отображение framebuffer непосредственно на экран.
  • Шаг 5 (большинство из них необязательно): выполните сложный чертеж. Это может включать поддержку других режимов рисования, таких как пиксель, линия, треугольная полоса, треугольный вентилятор и т.д. и поддержка текстуры, освещение, трансформация, взаимодействие с другими системами окон. Для этого нужно научиться сборке. Но заметьте, это не x86 или arm (CPU), скорее это сборка графического процессора, которая специализируется на обработке SIMD.
  • Шаг 6: реализовать функцию трафарета. Подготовьте трафарет приветствия в вашей программе. Очистка экрана цветом 1. Примените трафарет и снова очистить экран цветом 2. Теперь у вас есть привет мир, написанный цветом 2 с цветом 1 в качестве фона.

Мотивация сделать все это: вы хотите это сделать. И это будет круто.

Демотивация для этого: Возможная недоступность спецификаций GPU, кривая обучения для сборки GPU, сложность графики.

Моя рекомендация. Если вам доступны спецификации графического процессора (вместе с сборкой), я бы предложил реализовать подмножество любого доступного набора API (например, открыть vg и открыть GLES 1.1). Чтобы узнать больше об этих наборах API, посетите веб-сайт khronos.