Способ программирования графических процессоров (по крайней мере, расширенных функций) обычно осуществляется через MMIO (например, адрес в виртуальной памяти соответствует регистру в графическом процессоре вместо фактического DRAM) или, чаще, через буферы команд (например, часть памяти используется для хранения команд для графического процессора, которые GPU считывает последовательно.
Теперь эти команды и регистры сильно зависят от оборудования (даже в пределах одного поставщика оборудования): см., например, ATI R600 регистры. Они не являются "универсальными" вообще .
Эти типы интерфейсов используются разработчиками драйверов для реализации API-интерфейсов DirectX и OpenGL, типичных для программ.use.
Вероятно, лучшим источником "учебника" для этого уровня программирования являются драйверы с открытым исходным кодом в linux.