Vulkan — это кроссплатформенный API с низкими издержками для высокопроизводительной 3D-графики. Как и OpenGL ES (GLES) , Vulkan предоставляет инструменты для создания высококачественной графики в реальном времени в приложениях. Преимущества Vulkan включают снижение нагрузки на процессор и поддержку языка программирования SPIR-V Binary Intermediate .
Для успешного внедрения Vulkan устройство должно включать в себя:
- Загрузчик Vulkan, предоставленный Android.
- Драйвер Vulkan, предоставляемый SoC, такими как GPU IHV, реализующий API Vulkan . Для поддержки функциональности Vulkan устройству Android требуется совместимый с Vulkan графический процессор и соответствующий драйвер. Графический процессор также должен поддерживать 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, точки входа расширений, требуемых CDD Android, и множество дополнительных необязательных расширений. Расширения интеграции с Windows System (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
; поддерживается только один драйвер, а константная строка HWVULKAN_DEVICE_0
передается в open()
.
Производная Vulkan hw_device_t
соответствует одному драйверу, поддерживающему несколько физических устройств. Структура hw_device_t
может быть расширена для экспорта функций vkGetGlobalExtensionProperties()
, vkCreateInstance()
и vkGetInstanceProcAddr()
. Загрузчик может найти все остальные функции VkInstance()
, VkPhysicalDevice()
и vkGetDeviceProcAddr()
, вызвав функцию vkGetInstanceProcAddr()
структуры hw_device_t
.
ro.vulkan.apex
имя драйвера Vulkan.Обнаружение и загрузка слоев
Загрузчик Vulkan поддерживает перечисление и загрузку слоёв, которые могут предоставлять дополнительные расширения и перехватывать вызовы основного API на пути к драйверу. Android не включает слои в образ системы, однако приложения могут включать слои в свои APK.
При использовании слоёв помните, что модель безопасности и политики Android существенно отличаются от моделей безопасности и политик безопасности других платформ. В частности, Android не допускает загрузку внешнего кода в неотлаживаемый процесс на рабочих устройствах (без прав root), а также не позволяет внешнему коду проверять или контролировать память, состояние и т. д. процесса. Это включает в себя запрет на сохранение дампов ядра, трассировок API и т. д. на диск для последующего анализа. На рабочих устройствах включены только слои, поставляемые в составе неотлаживаемых приложений, и драйверы не должны предоставлять функциональность, нарушающую эти политики.
Примеры использования слоев включают:
- Слои времени разработки — слои проверки и оболочки для инструментов трассировки/профилирования/отладки не следует устанавливать в образ системы на производственных устройствах. Слои проверки и оболочки для инструментов трассировки/профилирования/отладки должны обновляться без образа системы. Разработчики, желающие использовать один из этих слоев во время разработки, могут изменить пакет приложения, например, добавив файл в каталог собственных библиотек. Предполагается, что инженеры IHV и OEM, желающие диагностировать сбои при поставке неизменяемых приложений, имеют доступ к непроизводственным (рутированным) сборкам образа системы, если только эти приложения не являются отлаживаемыми. Подробнее см. в разделе Слои проверки Vulkan на Android .
- Вспомогательные слои — эти слои предоставляют расширения, например, слой, реализующий менеджер памяти устройства. Разработчики выбирают слои и их версии для использования в своих приложениях; разные приложения, использующие один и тот же слой, могут использовать разные версии. Разработчики выбирают, какие из этих слоев включить в пакет своего приложения.
- Внедрённые (неявные) слои — включают такие слои, как частота кадров, социальные сети и наложения для запуска игр, предоставляемые пользователем или другим приложением без его ведома или согласия. Они нарушают политики безопасности Android и не поддерживаются.
Для неотлаживаемых приложений загрузчик ищет слои только в каталоге собственных библиотек приложения и пытается загрузить любую библиотеку с именем, соответствующим определенному шаблону (например, libVKLayer_foo.so
).
Для отлаживаемых приложений загрузчик ищет слои в /data/local/debug/vulkan
и пытается загрузить любую библиотеку, соответствующую определенному шаблону.
Android позволяет переносить слои между Android и другими платформами с помощью изменений в среде сборки. Подробнее об интерфейсе между слоями и загрузчиком см. в разделе «Архитектура интерфейсов загрузчика Vulkan» . Поддерживаемые Khronos слои валидации размещаются в слоях валидации Vulkan .
Версии и возможности API Vulkan
В следующей таблице перечислены версии API Vulkan для нескольких версий Android.Версия Android | Версия Вулкана |
---|---|
Андроид 13 | Вулкан 1.3 |
Андроид 9 | Вулкан 1.1 |
Андроид 7 | Вулкан 1.0 |
Обзор функциональности 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, можно найти на странице Core Revisions (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, можно найти на странице Core Revisions (Vulkan 1.2) .
Обзор функциональности Vulkan 1.1
Vulkan 1.1 поддерживает взаимодействие памяти и синхронизации, что позволяет OEM-производителям поддерживать 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, можно найти на странице Core Revisions (Vulkan 1.1) .
Выберите поддержку Vulkan
Устройства Android должны поддерживать самый продвинутый набор функций Vulkan, доступный из доступных, при условии, что они поддерживают 64-битный ABI и имеют достаточно памяти.
Устройства под управлением Android 13 и выше должны поддерживать Vulkan 1.3.
Устройства на базе Android 10 должны поддерживать Vulkan 1.1.
Другие устройства могут опционально поддерживать Vulkan 1.3, 1.2 и 1.1.
Поддержка версии Vulkan
Устройство Android поддерживает версию Vulkan, если выполняются следующие условия:
- Добавьте драйвер Vulkan, поддерживающий нужную версию Vulkan (это должна быть одна из версий Vulkan 1.3, 1.1 или 1.0), а также дополнительные требования CDD для версии Android. В качестве альтернативы, обновите существующий драйвер Vulkan до более низкой версии.
- Для Vulkan 1.3 или 1.1 убедитесь, что системная функция, возвращаемая менеджером пакетов, возвращает
true
для правильной версии Vulkan.- Для 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.3 и Vulkan 1.1, добавив правило, показанное ниже, в соответствующий файлdevice.mk
.- Добавьте следующее для 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.3 эта функция —
Базовый профиль 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()
не поддерживает флаги использования swapchain или расширенные флаги использования 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. При этом платформа предоставляет цепочке VkBindImageMemoryInfo
структуру расширения VkNativeBufferANDROID
с соответствующей информацией о буфере Gralloc, чтобы драйвер знал, с каким буфером 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, которая включает в себя следующее:
- Тесты соответствия Khronos Vulkan в модуле
CtsDeqpTestCases
, которые включают функциональные тесты API для Vulkan 1.0, 1.1, 1.2 и 1.3. - Модуль
CtsGraphicsTestCases
, который проверяет, правильно ли настроено устройство для поддерживаемых им возможностей Vulkan.
Флаг функции Vulkan
Устройство с поддержкой Android 11 или более поздней версии и API Vulkan должно предоставлять флаг функции android.software.vulkan.deqp.level
. Значение этого флага функции — это дата, закодированная в виде целого числа. Она указывает дату, связанную с тестами Vulkan dEQP, которые устройство, по его заявлению, прошло.
Дата в формате ГГГГ-ММ-ДД кодируется как 32-битное целое число следующим образом:
- Биты 0–15 хранят год.
- Биты 16–23 хранят месяц.
- Биты 24-31 хранят день
Минимально допустимое значение флага функции — 0x07E30301
, что соответствует дате 2019-03-01, которая является датой, связанной с тестами Vulkan dEQP для Android 10. Если флаг функции имеет по крайней мере это значение, устройство утверждает, что прошло все тесты Android 10 Vulkan dEQP.
Значение 0x07E40301
соответствует дате 2020-03-01, которая является датой, связанной с тестами Vulkan dEQP для Android 11. Если флаг функции имеет по крайней мере это значение, устройство утверждает, что прошло все тесты Android 11 Vulkan dEQP.
Значение 0x07E60301
соответствует дате 2022-03-01, которая является датой, связанной с тестами Vulkan dEQP для Android 13. Если флаг функции имеет по крайней мере это значение, устройство утверждает, что прошло все тесты Android 13 Vulkan dEQP.
Устройство, которое выдаёт определённый флаг функции ( например , 0x07E30301
, 0x07E40301
, 0x07E60301
), утверждает, что проходит все тесты Android Vulkan dEQP для этого флага функции (Android 10, Android 11, Android 13 соответственно). Это устройство может пройти тесты Vulkan dEQP для более поздних версий Android.
Vulkan dEQP входит в состав Android CTS. Начиная с Android 11, компонент CTS, запускающий тесты dEQP, распознаёт флаг функции android.software.vulkan.deqp.level
и пропускает любые тесты Vulkan dEQP, которые, согласно этому флагу, устройство не поддерживает. Такие тесты считаются пройденными тривиально.