Как использовать VkPipelineCache? - PullRequest
0 голосов
/ 08 февраля 2019

Если я правильно понимаю, я должен создать пустой объект VkPipelineCache, передать его в vkCreateGraphicsPipelines, и в него будут записаны данные.Затем я могу использовать его с другими создаваемыми конвейерами или сохранить в файл и использовать при следующем запуске.

Я пытался следовать примеру LunarG для получения дополнительной информации:

uint32_t headerLength = pData[0];
uint32_t cacheHeaderVersion = pData[1];
uint32_t vendorID = pData[2];
uint32_t deviceID = pData[3];

Но я всегда получаю headerLength - это 32, а остальные 0. Просмотр спецификации (https://vulkan.lunarg.com/doc/view/1.0.26.0/linux/vkspec.chunked/ch09s06.html Таблица 9.1), cacheHeaderVersion всегда должен быть равен 1, поскольку единственная доступная версия заголовка кэша - VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1.

Кроме того, размер pData обычно составляет всего 32 байта, даже когда я создаю 10 конвейеров сЭто.Что я делаю не так?

1 Ответ

0 голосов
/ 08 февраля 2019

Конвейерный кеш Vulkan - это непрозрачный объект, который имеет значение только для драйвера. очень мало операций, которые вы должны использовать на нем.

Идея состоит в том, что драйвер может использовать кэш для ускорения создания конвейеров в вашей программе, а также для ускорения создания конвейеров при последующих запусках вашего приложения.

Вы не должны пытаться интерпретировать данные кеша, возвращенные из vkGetPipelineCacheData вообще .Единственная цель для этих данных - передать их в последующий вызов vkCreatePipelineCache.

Кроме того, размер pData обычно составляет всего 32 байта, даже когда я создаю с ним 10 конвейеров.Что я делаю не так?

Драйверы должны реализовать vkCreatePipelineCache, vkGetPipelineCacheData и т. Д. Но на самом деле они не должны поддерживать кэширование.Поэтому, если вы работаете с драйвером, который не имеет ничего, что он может кэшировать, или не выполнил работу по поддержке кэширования, то вы естественным образом вернете пустой кеш (кроме заголовка).

...