Sebastian Aaltonen (30 лет в графике, работал в Ubisoft, Unity DOTS, Vulkan Advisory Panel) написал большой технический пост о том, почему современные «низкоуровневые» API на самом деле legacy, и как должен выглядеть API для современных GPU.
➡️ Главный тезис
DirectX 12, Vulkan и Metal проектировались 10 лет назад под GPU 13-летней давности. Тогда были разные архитектуры, разделение памяти, сложные биндинги.
На минуточку:
Текстурные сэмплеры не могли читать фреймбуфер, растеризатор не мог читать текстуры другого сэмплера. Из-за этого не было поддержки многопроходного рендеринга — нельзя было использовать результат одного прохода как текстуру для следующего.
Сейчас все GPU сошлись к единому дизайну: когерентные кэши, 64-битные указатели в шейдерах, bindless текстуры, PCIe ReBAR. Большая часть API-сложности больше не нужна.
➡️ Что можно выкинуть
🔘Весь зоопарк буферов (typed, structured, constant, vertex, index) → просто 64-битные указатели
🔘Descriptor sets / root signatures → один указатель на структуру данных
🔘Resource barriers с per-resource tracking → простые stage-to-stage барьеры
🔘Pipeline State Objects с сотнями комбинаций → минимум стейта
🔘Texture layout transitions → современные GPU их не требуют
➡️ Как должно выглядеть
// CPU: пишем данные напрямую в GPU-память
Data* data = gpuMalloc<Data>();
data->input = inputBuffer;
data->output = outputBuffer;
// Запуск — один указатель
gpuDispatch(cmd, pipeline, data, {128,1,1});
Шейдер получает один
const Data* — как thread function в OS. Никаких биндингов.Пост очень технический (детали про GCN, RDNA, descriptor heaps, DCC compression), но идея простая: GPU эволюционировали, API — нет.
📎 Оригинальный пост
@make_game