Внедрить Вулкан

Vulkan — это кроссплатформенный API с низкими издержками для высокопроизводительной 3D-графики. Как и OpenGL ES (GLES) , Vulkan предоставляет инструменты для создания высококачественной графики в реальном времени в приложениях. Преимущества использования Vulkan включают снижение нагрузки на процессор и поддержку языка SPIR-V Binary Intermediate .

Для успешного внедрения 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, точки входа расширений, требуемых CDD Android, и множество дополнительных необязательных расширений. Расширения интеграции систем Windows (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 .

Начиная с Android 15, загрузчик поддерживает APEX для загрузки драйвера Vulkan. Установите ro.vulkan.apex на имя Vulkan APEX, чтобы загрузить Vulkan из APEX.

Обнаружение и загрузка слоев

Загрузчик Vulkan поддерживает перечисление и загрузку слоев, которые могут предоставлять дополнительные расширения и перехватывать основные вызовы API на пути к драйверу. Android не включает слои в образ системы; однако приложения могут включать слои в свои APK.

При использовании слоев помните, что модель и политика безопасности Android существенно отличаются от других платформ. В частности, Android не позволяет загружать внешний код в неотлаживаемый процесс на производственных (нерутированных) устройствах, а также не позволяет внешнему коду проверять или контролировать память процесса, состояние и т. д. Это включает запрет на сохранение дампов ядра, трассировок 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. Все изменения, внесенные в ядро ​​Vulkan API с незначительной ревизией 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. Все изменения, внесенные в ядро ​​Vulkan API с незначительной ревизией 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, если выполняются следующие условия:

  1. Добавьте драйвер Vulkan, который поддерживает интересующую версию Vulkan (это должна быть одна из версий Vulkan 1.3, 1.1 или 1.0) вместе с дополнительными требованиями CDD версии Android. Либо обновите существующий драйвер Vulkan с более низким номером версии Vulkan.
  2. Для 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

Базовый профиль 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 могут потребовать выделения буферов swapchain с определенными реализацией частными флагами использования Gralloc. При создании swapchain 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, необходимыми для формата и использования. Флаги использования, возвращаемые драйвером, объединяются с флагами использования, запрошенными потребителем swapchain при выделении буферов.

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 , когда для swapchain требуются какие-либо флаги использования изображения swapchain. Структура расширения содержит флаги использования изображения swapchain:

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 . Указанный в структуре VkBindImageMemorySwapchainInfoKHR imageIndex должен быть допустимым индексом изображения 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 .

Проверка

OEM-производители могут протестировать свою реализацию 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 test runner знает о флаге функции android.software.vulkan.deqp.level и пропускает любые тесты Vulkan dEQP, которые — согласно этому флагу функции — устройство не поддерживает. Такие тесты сообщаются как тривиально пройденные.