Vulkan — это малозатратный кроссплатформенный API для высокопроизводительной 3D-графики. Подобно OpenGL ES (GLES) , Vulkan предоставляет инструменты для создания высококачественной графики в реальном времени в приложениях. Преимущества использования Vulkan включают снижение нагрузки на ЦП и поддержку промежуточного языка бинарных данных SPIR-V .
Для успешной реализации Vulkan устройство должно включать в себя:
- Загрузчик Vulkan, предоставляемый Android.
- Драйвер Vulkan, предоставляемый SoC, такими как GPU IHV, реализует API Vulkan . Для поддержки функциональности Vulkan устройству Android требуется аппаратное обеспечение GPU, поддерживающее Vulkan, и соответствующий драйвер. GPU также должен поддерживать GLES 3.1 и выше. Обратитесь к производителю вашего SoC для запроса поддержки драйвера.
Если устройство включает драйвер Vulkan, необходимо указать системные параметры FEATURE_VULKAN_HARDWARE_LEVEL и FEATURE_VULKAN_HARDWARE_VERSION , при этом версии параметров должны точно отражать возможности устройства. Это помогает гарантировать соответствие устройства требованиям документа по определению совместимости (CDD).
Загрузчик Вулкан
Загрузчик Vulkan platform/frameworks/native/vulkan является основным интерфейсом между приложениями Vulkan и драйвером Vulkan устройства. Загрузчик Vulkan устанавливается в /system/lib[64]/libvulkan.so . Загрузчик предоставляет основные точки входа API Vulkan, точки входа расширений, необходимых для Android CDD, и множество дополнительных необязательных расширений. Расширения Window System Integration (WSI) экспортируются загрузчиком и в основном реализуются в загрузчике, а не в драйвере. Загрузчик также поддерживает перечисление и загрузку слоев, которые могут предоставлять доступ к дополнительным расширениям и перехватывать вызовы основного API на пути к драйверу.
NDK включает в себя заглушку библиотеки libvulkan.so для компоновки. Библиотека экспортирует те же символы, что и загрузчик. Приложения вызывают функции, экспортируемые из настоящей библиотеки libvulkan.so , чтобы войти в функции-трамплины в загрузчике, которые, в свою очередь, направляют вызовы в соответствующий слой или драйвер на основе своего первого аргумента. Вызов vkGet*ProcAddr() возвращает указатели на функции, к которым направляются трамплины (то есть, он напрямую вызывает основной код API). Вызов через указатели на функции, а не через экспортируемые символы, более эффективен, поскольку он пропускает трамплин и отправку вызовов.
Подсчет и погрузка водителей
При сборке образа системы Android ожидает, что система будет знать, какие графические процессоры доступны. Загрузчик использует существующий механизм HAL в hardware.h для обнаружения и загрузки драйвера. Предпочтительные пути для 32-битных и 64-битных драйверов Vulkan:
/vendor/lib/hw/vulkan.<ro.hardware.vulkan>.so /vendor/lib/hw/vulkan.<ro.board.platform>.so /vendor/lib64/hw/vulkan.<ro.hardware.vulkan>.so /vendor/lib64/hw/vulkan.<ro.board.platform>.so
В Android 7.0 и выше производная Vulkan hw_module_t инкапсулирует единственную структуру hw_module_t ; поддерживается только один драйвер, и в функцию open() передается константная строка HWVULKAN_DEVICE_0 .
Производная структура Vulkan hw_device_t соответствует одному драйверу, который может поддерживать несколько физических устройств. Структура hw_device_t может быть расширена для экспорта функций vkGetGlobalExtensionProperties() , vkCreateInstance() и vkGetInstanceProcAddr() . Загрузчик может найти все остальные функции VkInstance() , VkPhysicalDevice() и vkGetDeviceProcAddr() , вызвав функцию vkGetInstanceProcAddr() из структуры hw_device_t .
ro.vulkan.apex на имя APEX-файла Vulkan, чтобы загрузить Vulkan из APEX.Обнаружение и загрузка слоев
Загрузчик Vulkan поддерживает перечисление и загрузку слоев, которые могут предоставлять доступ к дополнительным расширениям и перехватывать вызовы основного API на пути к драйверу. Приложения могут включать слои в свои APK-файлы. Android не включает слои в образ системы.
При использовании слоев следует помнить, что модель безопасности и политики Android значительно отличаются от других платформ. В частности, Android не разрешает загрузку внешнего кода в процесс, не подлежащий отладке, на устройствах, используемых в производственной среде (без root-прав), а также не разрешает внешнему коду проверять или контролировать память, состояние и т. д. процесса. Это включает запрет на сохранение дампов памяти, трассировок API и т. д. на диск для последующего анализа. На устройствах, используемых в производственной среде, включены только слои, поставляемые в составе приложений, не подлежащих отладке, и драйверы не должны предоставлять функциональность, нарушающую эти политики.
Примеры использования слоев включают:
- Слои для разработки — Слои проверки и промежуточные слои для инструментов трассировки/профилирования/отладки не должны устанавливаться на образ системы производственных устройств. Слои проверки и промежуточные слои для инструментов трассировки/профилирования/отладки должны быть обновляемыми без образа системы. Разработчики, желающие использовать один из этих слоев во время разработки, могут изменять пакет приложения, например, добавляя файл в каталог своих собственных библиотек. Инженеры производителей оборудования и OEM-производителей, желающие диагностировать сбои в поставляемых неизменяемых приложениях, предположительно имеют доступ к непроизводственным (рутированным) сборкам образа системы, если только эти приложения не являются отлаживаемыми. Для получения дополнительной информации см. Слои проверки Vulkan на Android .
- Вспомогательные слои — эти слои предоставляют доступ к расширениям, например, к слою, реализующему менеджер памяти для памяти устройства. Разработчики выбирают слои и их версии для использования в своем приложении; разные приложения, использующие один и тот же слой, могут использовать разные версии. Разработчики выбирают, какие из этих слоев включить в пакет своего приложения.
- Внедренные (неявные) слои — включают в себя такие слои, как наложения частоты кадров, социальных сетей и игровых лаунчеров, предоставляемые пользователем или другим приложением без ведома или согласия этого приложения. Они нарушают политику безопасности Android и не поддерживаются.
Для приложений, не подлежащих отладке, загрузчик ищет слои только в каталоге нативной библиотеки приложения и пытается загрузить любую библиотеку с именем, соответствующим определенному шаблону (например, libVKLayer_foo.so ). Эти слои загружаются в пространство имен приложения. Поэтому их необходимо собрать с помощью NDK.
Для отлаживаемых приложений загрузчик ищет слои в /data/local/debug/vulkan и пытается загрузить любую библиотеку, соответствующую определенному шаблону. Начиная с Android 10 (уровень API 29), Vulkan также может загружать слои, используемые в процессе разработки , из другого APK-файла . В обоих случаях загрузчик выбирает, какие слои включить для каждого приложения, используя системные настройки . Эти слои перечислены в vkEnumerateInstanceLayerProperties (то есть приложение может знать о них), даже если они загружаются без согласия приложения.
Android позволяет переносить слои с изменениями среды сборки между Android и другими платформами. Подробную информацию об интерфейсе между слоями и загрузчиком см. в разделе «Архитектура интерфейсов загрузчика Vulkan» . Слои валидации, поддерживаемые Khronos, размещены в Vulkan Validation Layers .
Версии и возможности API Vulkan
В таблице ниже перечислены версии API Vulkan для нескольких версий Android.| Версия для Android | Версия Vulkan |
|---|---|
| Android 16 | Вулкан 1.4 |
| Android 13 | Вулкан 1.3 |
| Android 9 | Вулкан 1.1 |
| Android 7 | Вулкан 1.0 |
Обзор функциональности Vulkan 1.4
Vulkan 1.4 включает в себя ряд ранее необязательных расширений, интегрированных в основную функциональность Vulkan. Большая часть этой функциональности включена с целью повышения контроля и детализации над программным интерфейсом Vulkan. Vulkan 1.4 увеличивает требования к аппаратному обеспечению по сравнению с Vulkan 1.3, при этом большая часть реализации осуществляется в драйвере графики, специфичном для SoC, а не в самой платформе.
Обзор функциональности Vulkan 1.3
Vulkan 1.3 включает в себя ряд ранее необязательных расширений, интегрированных в основную функциональность Vulkan. Большая часть этой функциональности включена с целью повышения контроля и детализации над программным интерфейсом Vulkan. Экземпляры однопроходного рендеринга больше не требуют объектов рендеринга или буферов кадров. Общее количество объектов состояния конвейера может быть уменьшено, а синхронизация внутри API переработана. Vulkan 1.3 имеет те же аппаратные требования, что и Vulkan 1.2, 1.1 и 1.0, при этом большая часть реализации находится в драйвере графики, специфичном для SoC, а не в фреймворке.
Наиболее важные функции Vulkan 1.3 для Android:
- Поддержка экземпляров однопроходного рендеринга
- Поддержка немедленного завершения вызова шейдера.
- Более детальный контроль над созданием, совместным использованием и управлением конвейерами обработки данных.
Vulkan 1.3 также включает в себя несколько небольших функций и улучшений удобства использования API. Все изменения, внесенные в ядро API Vulkan в минорной редакции 1.3, можно найти в разделе «Ревизии ядра (Vulkan 1.3)» .
Обзор функциональности Vulkan 1.2
Vulkan 1.2 добавляет ряд функций и расширений, упрощающих интерфейс API. Это включает в себя унифицированную модель памяти и дополнительную информацию, которую можно запросить у драйвера устройства. Vulkan 1.2 имеет те же аппаратные требования, что и Vulkan 1.0 и 1.1; вся реализация осуществляется в графическом драйвере, специфичном для SoC, а не в фреймворке.
Наиболее важной особенностью Vulkan 1.2 для Android является поддержка 8-битного хранилища.
Vulkan 1.2 также включает в себя несколько небольших функций и улучшений удобства использования API. Все изменения, внесенные в основной API Vulkan в минорной редакции 1.2, можно найти в разделе «Основные редакции (Vulkan 1.2)» .
Обзор функциональности Vulkan 1.1
Vulkan 1.1 включает поддержку взаимодействия памяти и синхронизации, что позволяет производителям оборудования поддерживать Vulkan 1.1 на своих устройствах. Кроме того, взаимодействие памяти и синхронизации позволяет разработчикам определять, поддерживается ли Vulkan 1.1 на устройстве, и эффективно использовать его, если он поддерживается. Vulkan 1.1 имеет те же аппаратные требования, что и Vulkan 1.0, но большая часть реализации находится в драйвере графики, специфичном для конкретного SOC, а не в фреймворке.
К наиболее важным функциям Vulkan 1.1 для Android относятся:
- Поддержка импорта и экспорта буферов памяти и объектов синхронизации извне Vulkan (для взаимодействия с камерой, кодеками и GLES).
- Поддержка форматов YCbCr
Vulkan 1.1 также включает в себя несколько небольших функций и улучшений удобства использования API. Все изменения, внесенные в основной API Vulkan в минорной редакции 1.1, можно найти в разделе «Основные редакции (Vulkan 1.1)» .
Выберите поддержку Vulkan
Все устройства Android должны поддерживать самый продвинутый набор функций Vulkan, при условии, что они поддерживают 64-битный ABI и не испытывают недостатка памяти.
Устройства, на которых установлена Android 16 и выше, должны поддерживать Vulkan 1.4.
Устройства, работающие под управлением Android 13 и выше, должны поддерживать Vulkan 1.3.
Устройства, запускаемые через Android 10, должны поддерживать Vulkan 1.1.
Другие устройства могут опционально поддерживать Vulkan 1.4, 1.3, 1.2 и 1.1.
Поддержка версии Vulkan
Устройство Android поддерживает версию Vulkan, если выполняются следующие условия:
- Добавьте драйвер Vulkan, поддерживающий интересующую вас версию Vulkan (это должна быть одна из версий Vulkan 1.4, 1.3, 1.1 или 1.0), а также дополнительные требования CDD для версии Android. В качестве альтернативы обновите существующий драйвер Vulkan с более низкой версией.
- Для Vulkan 1.4, 1.3 или 1.1 убедитесь, что функция системы, возвращаемая менеджером пакетов, возвращает
trueдля соответствующей версии Vulkan.- Для Vulkan 1.4 эта функция доступна по
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x404000). - Для Vulkan 1.3 эта функция называется
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000). - Для Vulkan 1.1 эта функция доступна по
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000).
trueдля Vulkan 1.4, 1.3 и 1.1, добавив правило, показанное ниже, в соответствующий файлdevice.mk.- Для Vulkan 1.4 добавьте следующее:
PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_4.xml: $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml
- Для Vulkan 1.3 добавьте следующее:
PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_3.xml: $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml
- Для Vulkan 1.1 добавьте следующее:
PRODUCT_COPY_FILES += frameworks/native/data/etc/android.hardware.vulkan.version-1_1.xml: $(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml
- Для Vulkan 1.4 эта функция доступна по
Базовый профиль Android (ABP)
Мы рекомендуем всем устройствам Android соответствовать последней версии профиля Android Baseline 2022, как описано в руководстве по профилям Android Baseline .
Любое устройство, поддерживающее Android 14 или выше и API Vulkan, должно соответствовать всем функциональным требованиям, определенным в профиле Android Baseline 2021. Полный список необходимых функций приведен в json файле профиля Vulkan, но ключевое подмножество необходимых функций включает в себя:
- Текстуры сжаты с помощью ASTC и ETC.
- Переменные цветовые пространства через
VK_EXT_swapchain_colorspace. - Затенение выборки и многовыборочная интерполяция с помощью
sampleRateShading.
Интеграция оконной системы (WSI)
В libvulkan.so драйвер реализует следующие расширения интеграции с оконной системой (WSI):
-
VK_KHR_surface -
VK_KHR_android_surface -
VK_KHR_swapchain -
VK_KHR_driver_properties, реализовано только для Vulkan 1.1 в Android 10. -
VK_GOOGLE_display_timingреализована для любой версии Vulkan в Android 10.
Объекты VkSurfaceKHR и VkSwapchainKHR , а также все взаимодействия с ANativeWindow обрабатываются платформой и не доступны драйверам. Реализация WSI использует расширение VK_ANDROID_native_buffer , которое должно поддерживаться драйвером; это расширение используется только реализацией WSI и не доступно приложениям.
Флаги использования Gralloc
Для реализаций Vulkan может потребоваться выделение буферов в цепочке обмена с флагами использования Gralloc, определяемыми реализацией. При создании цепочки обмена Android запрашивает у драйвера преобразование запрошенных флагов использования формата и изображения в флаги использования Gralloc путем вызова:
typedef enum VkSwapchainImageUsageFlagBitsANDROID {
VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID = 0x00000001,
VK_SWAPCHAIN_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF
} VkSwapchainImageUsageFlagBitsANDROID;
typedef VkFlags VkSwapchainImageUsageFlagsANDROID;
VkResult VKAPI vkGetSwapchainGrallocUsage2ANDROID(
VkDevice device,
VkFormat format,
VkImageUsageFlags imageUsage,
VkSwapchainImageUsageFlagsANDROID swapchainUsage,
uint64_t* grallocConsumerUsage,
uint64_t* grallocProducerUsage
);
Параметры format и imageUsage берутся из структуры VkSwapchainCreateInfoKHR . Драйвер должен заполнить *grallocConsumerUsage и *grallocProducerUsage флагами использования Gralloc, необходимыми для формата и использования. Флаги использования, возвращаемые драйвером, объединяются с флагами использования, запрошенными потребителем цепочки обмена при выделении буферов.
В Android 7.x используется более ранняя версия функции VkSwapchainImageUsageFlagsANDROID() , называемая vkGetSwapchainGrallocUsageANDROID() . В Android 8.0 и выше vkGetSwapchainGrallocUsageANDROID() объявлена устаревшей, но по-прежнему вызывается vkGetSwapchainGrallocUsageANDROID() если vkGetSwapchainGrallocUsage2ANDROID() не предоставляется драйвером:
VkResult VKAPI vkGetSwapchainGrallocUsageANDROID(
VkDevice device,
VkFormat format,
VkImageUsageFlags imageUsage,
int* grallocUsage
);
vkGetSwapchainGrallocUsageANDROID() не поддерживает флаги использования цепочки обмена или расширенные флаги использования Gralloc.
Изображения, поддерживаемые Gralloc
VkNativeBufferANDROID — это структура расширения vkCreateImage для создания образа с использованием буфера Gralloc. VkNativeBufferANDROID предоставляется функции vkCreateImage() в цепочке структур VkImageCreateInfo . Вызовы vkCreateImage() с VkNativeBufferANDROID происходят во время вызова vkCreateSwapchainKHR . Реализация WSI выделяет необходимое количество нативных буферов для цепочки обмена, а затем создает объект VkImage для каждого из них:
typedef struct {
VkStructureType sType; // must be VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID
const void* pNext;
// Buffer handle and stride returned from gralloc alloc()
buffer_handle_t handle;
int stride;
// Gralloc format and usage requested when the buffer was allocated.
int format;
int usage;
// Beginning in Android 8.0, the usage field above is deprecated and the
// usage2 struct below was added. The usage field is still filled in for
// compatibility with Android 7.0 drivers. Drivers for Android 8.0
// should prefer the usage2 struct, especially if the
// android.hardware.graphics.allocator HAL uses the extended usage bits.
struct {
uint64_t consumer;
uint64_t producer;
} usage2;
} VkNativeBufferANDROID;
При создании образа с использованием Gralloc VkImageCreateInfo содержит следующие данные:
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO .pNext = the above VkNativeBufferANDROID structure .imageType = VK_IMAGE_TYPE_2D .format = a VkFormat matching the format requested for the gralloc buffer .extent = the 2D dimensions requested for the gralloc buffer .mipLevels = 1 .arraySize = 1 .samples = 1 .tiling = VK_IMAGE_TILING_OPTIMAL .usage = VkSwapchainCreateInfoKHR::imageUsage .flags = 0 .sharingMode = VkSwapchainCreateInfoKHR::imageSharingMode .queueFamilyCount = VkSwapchainCreateInfoKHR::queueFamilyIndexCount .pQueueFamilyIndices = VkSwapchainCreateInfoKHR::pQueueFamilyIndices
В Android 8.0 и выше платформа предоставляет структуру расширения VkSwapchainImageCreateInfoKHR в цепочке VkImageCreateInfo передаваемой функции vkCreateImage , когда требуются какие-либо флаги использования образа цепочки обмена. Структура расширения содержит флаги использования образа цепочки обмена:
typedef struct {
VkStructureType sType; // must be VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID
const void* pNext;
VkSwapchainImageUsageFlagsANDROID usage;
} VkSwapchainImageCreateInfoANDROID;
В Android 10 и выше платформа поддерживает VK_KHR_swapchain v70, поэтому приложение Vulkan может создавать VkImage с использованием памяти swapchain. Сначала приложение вызывает vkCreateImage со структурой VkImageSwapchainCreateInfoKHR , связанной со структурой VkImageCreateInfo . Затем приложение вызывает vkBindImageMemory2(KHR) со структурой VkBindImageMemorySwapchainInfoKHR , связанной со структурой VkBindImageMemoryInfo . imageIndex указанный в структуре VkBindImageMemorySwapchainInfoKHR должен быть допустимым индексом изображения swapchain. При этом платформа предоставляет структуру расширения VkNativeBufferANDROID с соответствующей информацией о буфере Gralloc для цепочки VkBindImageMemoryInfo , чтобы драйвер знал, к какому буферу Gralloc следует привязать VkImage .
Получить изображения
vkAcquireImageANDROID получает права собственности на образ цепочки обменов и импортирует внешний сигнализированный собственный барьер как в существующий объект VkSemaphore , так и в существующий объект VkFence :
VkResult VKAPI vkAcquireImageANDROID(
VkDevice device,
VkImage image,
int nativeFenceFd,
VkSemaphore semaphore,
VkFence fence
);
vkAcquireImageANDROID() вызывается во время выполнения vkAcquireNextImageKHR для импорта нативного барьера в объекты VkSemaphore и VkFence , предоставляемые приложением (однако объекты семафора и барьера в этом вызове являются необязательными). Драйвер также может использовать эту возможность для распознавания и обработки любых внешних изменений состояния буфера Gralloc; многим драйверам здесь ничего делать не потребуется. Этот вызов переводит VkSemaphore и VkFence в то же состояние ожидания, как если бы они были помечены сигналом от vkQueueSubmit , поэтому очереди могут ожидать семафора, а приложение — барьера.
Оба объекта становятся сигнализированными, когда базовый собственный барьер подает сигнал; если собственный барьер уже подал сигнал, то семафор находится в сигнализированном состоянии, когда эта функция возвращается. Драйвер принимает на себя управление дескриптором файла барьера и закрывает его, когда он больше не нужен. Драйвер должен сделать это, даже если ни семафор, ни объект барьера не предоставлены, или даже если vkAcquireImageANDROID завершается с ошибкой. Если fenceFd равно -1, это означает, что собственный барьер уже подал сигнал.
Изображения для выпуска
vkQueueSignalReleaseImageANDROID подготавливает образ цепочки обмена для внешнего использования, создает собственный ограничитель и планирует отправку сигнала на основе этого ограничителя после того, как входные семафоры уже подадут сигнал:
VkResult VKAPI vkQueueSignalReleaseImageANDROID(
VkQueue queue,
uint32_t waitSemaphoreCount,
const VkSemaphore* pWaitSemaphores,
VkImage image,
int* pNativeFenceFd
);
Функция vkQueuePresentKHR() вызывает функцию vkQueueSignalReleaseImageANDROID() для предоставленной очереди. Драйвер должен создать собственный барьер, который не будет сигнализировать до тех пор, пока не сработают все семафоры waitSemaphoreCount в pWaitSemaphores и не будет завершена вся дополнительная работа, необходимая для подготовки image к показу.
Если семафоры ожидания (если таковые имеются) уже активированы, и queue уже свободна, драйвер может установить *pNativeFenceFd в -1 вместо фактического дескриптора файла ограждения, указывая, что ждать нечего. Вызывающая сторона владеет и закрывает дескриптор файла, возвращенный в *pNativeFenceFd .
Многие драйверы могут игнорировать параметр образа, но некоторым может потребоваться подготовить структуры данных на стороне ЦП, связанные с буфером Gralloc, для использования внешними потребителями образа. Подготовка содержимого буфера для использования внешними потребителями должна выполняться асинхронно в рамках перехода образа в состояние VK_IMAGE_LAYOUT_PRESENT_SRC_KHR .
Если образ был создан с использованием VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID , то драйвер должен разрешить многократный вызов функции vkQueueSignalReleaseImageANDROID() без промежуточных вызовов функции vkAcquireImageANDROID() .
Поддержка презентабельных изображений (в целом)
Некоторые устройства могут совместно использовать одно и то же изображение между конвейером отображения и реализацией Vulkan для минимизации задержки. В Android 9 и выше загрузчик условно объявляет расширение VK_KHR_shared_presentable_image в зависимости от ответа драйвера на вызов vkGetPhysicalDeviceProperties2 .
Если драйвер не поддерживает ни Vulkan 1.1, ни расширение VK_KHR_physical_device_properties2 , загрузчик не сообщает о поддержке общих презентабельных образов. В противном случае загрузчик запрашивает возможности драйвера, вызывая функцию vkGetPhysicalDeviceProperties2() и добавляя следующую структуру в цепочку VkPhysicalDeviceProperties2::pNext :
typedef struct {
VkStructureType sType; // must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID
const void* pNext;
VkBool32 sharedImage;
} VkPhysicalDevicePresentationPropertiesANDROID;
Если драйвер может совместно использовать изображение с системой отображения, он устанавливает член sharedImage в значение VK_TRUE .
Проверка
Производители оборудования могут тестировать свои реализации Vulkan с помощью CTS, которая включает в себя следующее:
- Тесты на соответствие протоколу Vulkan от Khronos, входящие в модуль
CtsDeqpTestCases, включают функциональные тесты API для Vulkan версий 1.0, 1.1, 1.2, 1.3 и 1.4. - Модуль
CtsGraphicsTestCasesпроверяет правильность настройки устройства для поддерживаемых им возможностей Vulkan.
флаг функции Vulkan
Для работы устройства, поддерживающего Android 11 или выше и API Vulkan, необходим флаг функции android.software.vulkan.deqp.level . Значение этого флага представляет собой дату, закодированную в виде целого числа. Он указывает дату, связанную с тестами Vulkan dEQP, которые, по утверждению устройства, успешно пройдены.
Дата в формате ГГГГ-ММ-ДД кодируется в 32-битное целое число следующим образом:
- В памяти Bits 0-15 хранится год.
- В течение месяца хранятся биты 16-23.
- Магазин Bits 24-31 на день
Минимально допустимое значение для флага функции — 0x07E30301 , что соответствует дате 2019-03-01, связанной с тестами Vulkan dEQP для Android 10. Если значение флага функции не меньше этого, устройство утверждает, что прошло все тесты Vulkan dEQP для Android 10.
Значение 0x07E40301 соответствует дате 2020-03-01, которая связана с тестами Vulkan dEQP для Android 11. Если флаг функции имеет значение не меньше этого, устройство утверждает, что прошло все тесты Vulkan dEQP для Android 11.
Значение 0x07E60301 соответствует дате 2022-03-01, которая связана с тестами Vulkan dEQP для Android 13. Если флаг функции имеет значение не меньше этого, устройство утверждает, что прошло все тесты Vulkan dEQP для Android 13.
Устройство, использующее определенный флаг функции ( например, 0x07E30301 , 0x07E40301 , 0x07E60301 ), утверждает, что прошло все тесты Android Vulkan dEQP для этого флага функции (Android 10, Android 11, Android 13 соответственно). Это устройство может пройти тесты Vulkan dEQP, начиная с более поздней версии Android.
Vulkan dEQP является частью Android CTS. Начиная с Android 11, компонент запуска тестов dEQP в CTS учитывает флаг функции android.software.vulkan.deqp.level и пропускает любые тесты Vulkan dEQP, которые, согласно этому флагу, устройство не заявляет о поддержке. Такие тесты отображаются как тривиально пройденные.