← На главную

Создан Loon GPU — обёртка графических API на указателях и malloc/free

09.07.2026 14:00 · hackernews

Разработчик, вдохновившись постом Себастьяна Аалтонена «No Graphics API», создал проект Loon GPU и выложил его на GitHub. Это обёртка поверх существующих графических API, которая максимально приближается к идее «никакого графического API» — с GPU-указателями и без лишней бюрократии.

Ключевая идея: никаких buffer objects, vertex buffers или bind groups. Вместо этого — везде GPU pointers. Память выделяется через malloc, освобождается через free. По умолчанию память персистентно отображена на CPU, но можно запросить GPU-local или память для чтения с CPU. Указатели универсальны — один и тот же device pointer подходит для всех трёх типов. Есть функция get_host_pointer(), чтобы получить CPU-указатель.

Текстуры и сэмплеры — bindless, через индексы в большом heap-объекте. Шейдерам данные передаются просто через device pointer. На Metal это тривиально — API поддерживает привязку произвольных указателей. На Vulkan — через push constants. Внутри Loon всё равно создаёт VkBuffer или MTLHeap, а для обратной карты указатель → буфер+смещение используется бинарный поиск по сортированному списку. Новое расширение Vulkan VK_KHR_device_address_commands скоро должно упростить этот процесс.

Основная проблема сейчас — шейдеры. Разработчик выбрал Slang, но поддержка Metal в Slang экспериментальная, возникли сложности: в Vulkan push constants для разных стадий накладываются на один диапазон, разделить аргументы для вершинного и фрагментного шейдеров нельзя без костылей. Пришлось вручную переводить шейдеры под Metal и выбирать между ними в рантайме. Для compute шейдеров синтаксис Slang работает нормально. Ещё одна головная боль — threadgroup sizes в Metal: они задаются при диспатче, а не в шейдере, так что Loon парсит аннотацию required_threads_per_threadgroup() из исходников — хак, но работает.

Для texturing: Metal поддерживает bindless нативно, Vulkan — через descriptor indexing с крупным набором. Image layouts решили игнорировать — все текстуры инициализируются в VK_IMAGE_LAYOUT_GENERAL через глобальный список при первом коммите. VK_KHR_unified_image_layouts на современных NVIDIA позволяет, на других вендорах — пока неясно, но на RDNA3 и выше это не критично.

Что пока не получилось: gpuSetBlendState() из исходной концепции — на Metal нет динамического блендинга. Split barriers с сигналами по значению в памяти — аналогов в API нет. Texture heaps оставили непрозрачными, так как VK_EXT_descriptor_heap ещё сырой.

Сейчас автор добавляет дебаг-группы, GPU captures и обработку ошибок. В планах — mesh shaders и hardware ray tracing, но не приоритетно. Новые расширения Vulkan (VK_EXT_descriptor_heap, VK_KHR_device_address_commands) — для производительности. Разработчик уволился, переезжает с семьёй в Канаду и планирует активно дорабатывать библиотеку в свободное время.

Читать оригинал →