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.Обнаружение и загрузка слоев
The Vulkan loader supports enumerating and loading layers that can expose additional extensions and intercept core API calls on their way to the driver. Apps can include layers in their APK. Android doesn't include layers on the system image.
При использовании слоев следует помнить, что модель безопасности и политики Android значительно отличаются от других платформ. В частности, Android не разрешает загрузку внешнего кода в процесс, не подлежащий отладке, на устройствах, используемых в производственной среде (без root-прав), а также не разрешает внешнему коду проверять или контролировать память, состояние и т. д. процесса. Это включает в себя запрет на сохранение дампов памяти, трассировок API и т. д. на диск для последующего анализа. На устройствах, используемых в производственной среде, включены только слои, поставляемые в составе приложений, не подлежащих отладке, и драйверы не должны предоставлять функциональность, нарушающую эти политики.
Примеры использования слоев включают:
- Слои разработки — Слои проверки и промежуточные модули для инструментов трассировки/профилирования/отладки не должны устанавливаться на образ системы производственных устройств. Слои проверки и промежуточные модули для инструментов трассировки/профилирования/отладки должны быть обновляемыми без образа системы. Разработчики, желающие использовать один из этих слоев во время разработки, могут изменять пакет приложения, например, добавляя файл в каталог своих собственных библиотек. Инженеры производителей оборудования и OEM-производителей, желающие диагностировать сбои в поставляемых неизменяемых приложениях, предположительно имеют доступ к непроизводственным (рутированным) сборкам образа системы, если только эти приложения не являются отлаживаемыми. Для получения дополнительной информации см. Слои проверки Vulkan на Android .
- Utility layers — These layers expose extensions, such as a layer that implements a memory manager for device memory. Developers choose layers, and versions of those layers, to use in their app; different apps using the same layer may still use different versions. Developers choose which of these layers to ship in their app package.
- Внедренные (неявные) слои — включают в себя такие слои, как наложения частоты кадров, социальных сетей и игровых лаунчеров, предоставляемые пользователем или другим приложением без ведома или согласия этого приложения. Они нарушают политику безопасности 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.- For Vulkan 1.4 the feature is
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
- For Vulkan 1.4 the feature is
Базовый профиль 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 implementations may need swapchain buffers to be allocated with implementation-defined private Gralloc usage flags. When creating a swapchain, Android asks the driver to translate the requested format and image usage flags into Gralloc usage flags by calling:
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 на день
The minimum allowed value for the feature flag is 0x07E30301 , which corresponds to the date 2019-03-01, which is the date associated with the Vulkan dEQP tests for Android 10. If the feature flag is at least this value, the device claims to pass all of the Android 10 Vulkan dEQP tests.
Значение 0x07E40301 соответствует дате 2020-03-01, которая связана с тестами Vulkan dEQP для Android 11. Если флаг функции имеет значение не меньше этого, устройство утверждает, что прошло все тесты Vulkan dEQP для Android 11.
Значение 0x07E60301 соответствует дате 2022-03-01, которая связана с тестами Vulkan dEQP для Android 13. Если флаг функции имеет значение не меньше этого, устройство утверждает, что прошло все тесты Vulkan dEQP для Android 13.
A device that exposes a specific feature flag ( ie 0x07E30301 , 0x07E40301 , 0x07E60301 ) claims to pass all Android Vulkan dEQP tests of that feature flag (Android 10, Android 11, Android 13 respectively). This device may pass Vulkan dEQP tests from a later Android release.
Vulkan dEQP является частью Android CTS. Начиная с Android 11, компонент запуска тестов dEQP в CTS учитывает флаг функции android.software.vulkan.deqp.level и пропускает любые тесты Vulkan dEQP, которые, согласно этому флагу, устройство не заявляет о поддержке. Такие тесты отображаются как тривиально пройденные.