Microsoft описала базу объектов состояния для Advanced Shader Delivery

Microsoft опубликовала спецификацию State Object Database, базы данных объектов состояния для D3D12 Advanced Shader Delivery. Она хранит описания объектов состояния и объектов состояния конвейера, используемых приложением, вместе с шейдерами DXIL. Эти данные нужны для создания предварительно скомпилированного кэша и для запасного сценария, когда нужного объекта в кэше нет.
Спецификация описывает интерфейсы для создания базы из файла, записи в неё данных приложения, сохранения и поиска описания объекта конвейера или объекта состояния. База также позволяет узнать версию ранее сохранённого объекта по уникальному ключу. Для её создания используется фабрика ID3D12StateObjectDatabaseFactory, получаемая через D3D12GetInterface.
В метаданных приложения предусмотрены имя исполняемого файла, название и версия, а также необязательные имя и версия игрового движка. Microsoft указывает, что эти сведения могут использоваться при выборе профиля компилятора для конкретного приложения. Описание следует обновлять при изменении версии приложения или движка.
Что хранит State Object Database
База охватывает все типы объектов конвейера. Для трассировки лучей и work graphs в ней сериализуется полное описание объекта состояния вместе с DXIL-шейдерами. Для графических и вычислительных программ сохраняется описание каждой программы и её DXIL-код, а для Pipeline State Object записывается полное описание конвейера со всеми шейдерами.
- объекты состояния для трассировки лучей и work graphs;
- графические и вычислительные программы;
- объекты состояния конвейера, или PSO;
- DXIL-шейдеры и связанные с ними описания.
Каждая запись получает уникальный ключ и номер версии. Один объект может иметь только одну сохранённую версию одновременно, а автор базы должен повышать её при изменении содержимого. Ключ не обязан зависеть от описания самого объекта: разработчик может использовать собственную схему идентификации. Версия помогает сопоставлять описание с предварительно скомпилированными двоичными данными из другой базы.
При сохранении описаний нельзя оставлять ссылки на API-объекты, зависящие от драйвера. Например, указатели на корневые сигнатуры заменяются сериализованными описаниями. Для объектов состояния ссылки на существующие коллекции также подменяются структурой D3D12_EXISTING_COLLECTION_BY_KEY_DESC, которая обращается к коллекции по ключу, а не через указатель API.
Новый тип подобъекта D3D12_STATE_SUBOBJECT_TYPE_EXISTING_COLLECTION_BY_KEY получил значение 36. Он предназначен для хранения описаний в базе и не применяется при прямом создании объектов через ID3D12Device5::CreateStateObject или ID3D12Compiler::CompileStateObject. State Object Database реализована как база SQLite; версия её схемы указана как 2.



