Поэтому я хотел сделать библиотеку, чтобы упростить программирование на Vulkan. Вы можете увидеть его на Github, но не ждите ничего серьезного в ближайшее время ;). Я хочу создать функцию с именем getInstanceLayerProperties
, которая возвращает все свойства слоя (очевидно). Увидев, что это может быть медленнее, я хотел его оптимизировать. Моя идея проста: сохранить его как предварительно вычисленный массив. Все, что мне нужно знать, это: могут ли слои Vulkan меняться во время выполнения. Например, скажем, я кэшировал значения vkEnumerateInstanceLayerProperties
. Можно ли удалить, добавить или изменить новые свойства слоя, чтобы при повторном вызове этой функции я получал другие результаты?
Могут ли слои Vulkan изменяться во время выполнения?
Ответы (2)
vkEnumerate*Properties возвращает информацию о состоянии системы на момент выполнения вызова. Это казалось нам довольно очевидным, когда мы писали спецификацию, но я понимаю, что это может быть не так очевидно для тех, кто плохо знаком с Вулканом.
Поскольку слои определены вне Vulkan, они могут меняться со временем. Вряд ли, но могут. Это одна из причин, по которой эти вызовы могут возвращать VK_INCOMPLETE. Типичным использованием было бы сначала сделать вызов, чтобы получить количество, выделить место для результата, а затем получить данные. Если между этими двумя вызовами список расширится, приложение увидит VK_INCOMPLETE и узнает, что что-то изменилось.
Прежде всего, я хотел бы отметить, что это идеальный способ НЕ оптимизировать код. Это не так, и семантически даже не может быть горячей точкой.
Вы даже не можете использовать кэшированную информацию, если не уничтожите свой старый экземпляр/устройство и не создадите новый.
Теперь ответ:
В спецификации нет утверждений, которые явно предотвращают аннулирование результата.
ОБНОВЛЕНИЕ 2: поэтому они могут измениться в любое время. Хотя это было бы редкостью. Единственным окончательным результатом является то, возвращает ли vkCreateInstance()
VK_SUCCESS
или VK_ERROR_LAYER_NOT_PRESENT
.
(На самом деле мне немного не нравится, что практически все команды vkGet*
и vkEnumerate*
не указывают характер неизменности своих результатов. Но потом я несколько забыл поднять это как проблему GitHub... ОБНОВЛЕНИЕ 2: сделал это сейчас, пока я снова не забыл)
Код реализации, делающий это, должен быть с открытым исходным кодом. Это должно быть частью официального «Загрузчика» (также являющегося частью LunarG SDK). Я могу исследовать позже. Хотя разумно предположить, что новый набор слоев считывается каждый раз из реестра (то есть в Windows). По общему признанию, это в любом случае бесполезная информация, поскольку они могут решить изменить свое поведение.
ОБНОВЛЕНИЕ: я только что отсканировал его только быстро, но действительно кажется, что слои сканируются заново при каждом вызове vkEnumerateInstanceLayerProperties
: trampoline.c#L227" rel="nofollow">https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/74d013a5438f47a66a77d5375d1cdeef3f0beca7/loader/trampoline.c#L227
vkEnumerateInstanceLayerProperties
, а также vkEnumerateInstanceExtensionProperties
полностью не зависит от какого-либо отдельного экземпляра и происходит до создания экземпляров. Весь смысл этих функций заключается в том, чтобы увидеть, можете ли вы создать экземпляр с этими определенными слоями/расширениями!
- person Jerfov2; 11.07.2016