Mengimplementasikan Vulkan

Vulkan adalah API lintas platform dengan overhead rendah untuk grafis 3D berperforma tinggi. Seperti OpenGL ES (GLES), Vulkan menyediakan alat untuk membuat grafik real-time berkualitas tinggi di aplikasi. Keunggulan menggunakan Vulkan mencakup pengurangan overhead CPU dan dukungan untuk bahasa SPIR-V Binary Intermediate.

Agar berhasil menerapkan Vulkan, perangkat harus menyertakan:

  • Loader Vulkan, yang disediakan oleh Android.
  • Driver Vulkan, yang disediakan oleh SoC seperti IHV GPU, yang menerapkan Vulkan API. Untuk mendukung fungsi Vulkan, perangkat Android memerlukan hardware GPU yang mendukung Vulkan dan driver terkait. GPU juga harus mendukung GLES 3.1 dan yang lebih tinggi. Hubungi vendor SoC Anda untuk meminta dukungan driver.

Jika perangkat menyertakan driver Vulkan, perangkat harus mendeklarasikan fitur sistem FEATURE_VULKAN_HARDWARE_LEVEL dan FEATURE_VULKAN_HARDWARE_VERSION, dengan versi yang mencerminkan kemampuan perangkat secara akurat. Hal ini membantu memastikan bahwa perangkat mematuhi Dokumen Definisi Kompatibilitas (CDD).

Loader Vulkan

platform/frameworks/native/vulkan loader Vulkan adalah antarmuka utama antara aplikasi Vulkan dan driver Vulkan perangkat. Loader Vulkan diinstal pada /system/lib[64]/libvulkan.so. Loader menyediakan titik entri Vulkan API inti, titik entri ekstensi yang diperlukan oleh CDD Android, dan banyak ekstensi opsional tambahan. Ekstensi Integrasi Sistem Jendela (WSI) diekspor oleh loader dan terutama diimplementasikan di loader, bukan di driver. Loader juga mendukung enumerasi dan pemuatan lapisan yang dapat mengekspos ekstensi tambahan dan mencegat panggilan API inti dalam perjalanannya ke driver.

NDK menyertakan library libvulkan.so stub untuk penautan. Library mengekspor simbol yang sama dengan loader. Aplikasi memanggil fungsi yang diekspor dari library libvulkan.so sebenarnya untuk memasukkan fungsi trampolin di loader, yang dikirim ke lapisan atau driver yang sesuai berdasarkan argumen pertamanya. Panggilan vkGet*ProcAddr() menampilkan pointer fungsi yang menjadi tujuan pengiriman trampolin (yaitu, panggilan langsung ke kode API inti). Memanggil melalui pointer fungsi, bukan simbol yang diekspor, lebih efisien karena melewati trampolin dan pengiriman.

Pengenumerasian dan pemuatan driver

Saat image sistem dibangun, Android mengharapkan sistem mengetahui GPU mana yang tersedia. Loader menggunakan mekanisme HAL yang ada di hardware.h untuk menemukan dan memuat driver. Jalur yang lebih disukai untuk driver Vulkan 32-bit dan 64-bit adalah:

/vendor/lib/hw/vulkan.<ro.hardware.vulkan>.so
/vendor/lib/hw/vulkan.<ro.product.platform>.so
/vendor/lib64/hw/vulkan.<ro.hardware.vulkan>.so
/vendor/lib64/hw/vulkan.<ro.product.platform>.so

Di Android 7.0 dan yang lebih tinggi, turunan hw_module_t Vulkan menggabungkan satu struct hw_module_t; hanya satu driver yang didukung dan string konstan HWVULKAN_DEVICE_0 diteruskan ke open().

Turunan hw_device_t Vulkan sesuai dengan satu driver yang dapat mendukung beberapa perangkat fisik. Struktur hw_device_t dapat diperluas untuk mengekspor fungsi vkGetGlobalExtensionProperties(), vkCreateInstance(), dan vkGetInstanceProcAddr(). Loader dapat menemukan semua fungsi VkInstance(), VkPhysicalDevice(), dan vkGetDeviceProcAddr() lainnya dengan memanggil vkGetInstanceProcAddr() struktur hw_device_t.

Penemuan dan pemuatan lapisan

Loader Vulkan mendukung enumerasi dan pemuatan lapisan yang dapat mengekspos ekstensi tambahan dan mencegat panggilan API inti dalam perjalanannya ke driver. Android tidak menyertakan lapisan pada image sistem; tetapi, aplikasi dapat menyertakan lapisan dalam APK-nya.

Saat menggunakan lapisan, perlu diingat bahwa model dan kebijakan keamanan Android sangat berbeda dengan platform lainnya. Secara khusus, Android tidak mengizinkan pemuatan kode eksternal ke proses yang tidak dapat di-debug pada perangkat produksi (non-root), juga tidak mengizinkan kode eksternal untuk memeriksa atau mengontrol memori, status, dan seterusnya proses. Hal ini mencakup larangan menyimpan core dump, pelacakan API, dan sebagainya ke disk untuk pemeriksaan nanti. Hanya lapisan yang dikirimkan sebagai bagian dari aplikasi yang tidak dapat di-debug yang diaktifkan di perangkat produksi, dan driver tidak boleh menyediakan fungsi yang melanggar kebijakan ini.

Kasus penggunaan untuk lapisan meliputi:

  • Lapisan waktu pengembangan — Lapisan validasi dan shim untuk alat pelacakan/pembuatan profil/proses debug tidak boleh diinstal di image sistem perangkat produksi. Lapisan validasi dan shim untuk alat pelacakan/pembuatan profil/proses debug harus dapat diupdate tanpa image sistem. Developer yang ingin menggunakan salah satu lapisan ini selama pengembangan dapat memodifikasi paket aplikasi, misalnya, dengan menambahkan file ke direktori library native mereka. Engineer IHV dan OEM yang ingin mendiagnosis kegagalan dalam mengirimkan aplikasi yang tidak dapat diubah diasumsikan memiliki akses ke build nonproduksi (root) image sistem, kecuali jika aplikasi tersebut dapat di-debug. Untuk informasi selengkapnya, lihat Lapisan validasi Vulkan di Android.
  • Lapisan utilitas — Lapisan ini mengekspos ekstensi, seperti lapisan yang mengimplementasikan pengelola memori untuk memori perangkat. Developer memilih lapisan, dan versi lapisan tersebut, untuk digunakan dalam aplikasi mereka; aplikasi yang berbeda yang menggunakan lapisan yang sama mungkin masih menggunakan versi yang berbeda. Developer memilih lapisan ini yang akan dikirimkan dalam paket aplikasi mereka.
  • Lapisan yang dimasukkan (implisit) — Mencakup lapisan seperti kecepatan frame, jaringan sosial, dan overlay peluncur game yang disediakan oleh pengguna atau beberapa aplikasi lain tanpa sepengetahuan atau izin aplikasi. Tindakan ini melanggar kebijakan keamanan Android dan tidak didukung.

Untuk aplikasi yang tidak dapat di-debug, loader hanya menelusuri lapisan di direktori library native aplikasi dan mencoba memuat library apa pun dengan nama yang cocok dengan pola tertentu (misalnya, libVKLayer_foo.so).

Untuk aplikasi yang dapat di-debug, loader akan menelusuri lapisan di /data/local/debug/vulkan dan mencoba memuat library yang cocok dengan pola tertentu.

Android memungkinkan lapisan di-port dengan perubahan lingkungan build antara Android dan platform lainnya. Untuk mengetahui detail tentang antarmuka antara lapisan dan loader, lihat Arsitektur Antarmuka Vulkan Loader. Lapisan validasi yang dikelola Khronos dihosting di Lapisan Validasi Vulkan.

Versi dan kemampuan Vulkan API

Tabel berikut mencantumkan versi Vulkan API untuk beberapa rilis Android.
Versi Android Versi Vulkan
Android 13 Vulkan 1.3
Android 9 Vulkan 1.1
Android 7 Vulkan 1.0

Ringkasan fungsi Vulkan 1.3

Vulkan 1.3 menganonimkan sejumlah ekstensi yang sebelumnya opsional ke dalam fungsi inti Vulkan. Sebagian besar fungsi ini disertakan dengan tujuan meningkatkan kontrol dan perincian atas antarmuka pemrograman Vulkan. Instance penerusan render single-pass tidak lagi memerlukan objek penerusan render atau framebuffer. Jumlah total objek status pipeline dapat dikurangi, dan sinkronisasi dalam API akan dirombak. Vulkan 1.3 memiliki persyaratan hardware yang sama dengan Vulkan 1.2, 1.1, dan 1.0, dengan sebagian besar penerapan di driver grafis khusus SoC, bukan dalam framework.

Fitur Vulkan 1.3 yang paling penting untuk Android adalah:

  • Dukungan untuk instance pass render satu jalur
  • Dukungan untuk segera menghentikan pemanggilan shader
  • Tingkat perincian yang lebih baik atas pembuatan, berbagi, dan kontrol pipeline

Vulkan 1.3 juga menyertakan beberapa fitur yang lebih kecil dan peningkatan kegunaan API. Semua perubahan yang dilakukan pada Vulkan API inti dengan revisi minor 1.3 dapat ditemukan di Core Revisions (Vulkan 1.3).

Ringkasan fungsi Vulkan 1.2

Vulkan 1.2 menambahkan sejumlah fitur dan ekstensi yang menyederhanakan platform API. Hal ini mencakup Model Memori terpadu dan informasi tambahan yang dapat dikueri dari driver perangkat. Vulkan 1.2 memiliki persyaratan hardware yang sama dengan Vulkan 1.0 dan 1.1; semua implementasi tersebut berada di driver grafis khusus SoC, bukan framework.

Fitur Vulkan 1.2 yang paling penting untuk Android adalah dukungan untuk penyimpanan 8-bit.

Vulkan 1.2 juga menyertakan beberapa fitur yang lebih kecil dan peningkatan kegunaan API. Semua perubahan yang dilakukan pada Vulkan API inti dengan revisi minor 1.2 dapat ditemukan di Core Revisions (Vulkan 1.2).

Ringkasan fungsi Vulkan 1.1

Vulkan 1.1 menyertakan dukungan untuk interop memori/sinkronisasi, yang memungkinkan OEM mendukung Vulkan 1.1 di perangkat. Selain itu, interop memori/sinkronisasi memungkinkan developer untuk menentukan apakah Vulkan 1.1 didukung di perangkat, dan menggunakannya secara efektif jika didukung. Vulkan 1.1 memiliki persyaratan hardware yang sama dengan Vulkan 1.0, tetapi sebagian besar implementasinya ada di driver grafis khusus SOC, bukan di framework.

Fitur Vulkan 1.1 yang paling penting untuk Android adalah:

  • Dukungan untuk mengimpor dan mengekspor buffering memori dan objek sinkronisasi dari luar Vulkan (untuk interop dengan kamera, codec, dan GLES)
  • Dukungan untuk format YCbCr

Vulkan 1.1 juga mencakup beberapa fitur yang lebih kecil dan peningkatan kegunaan API. Semua perubahan yang dilakukan pada Vulkan API inti dengan revisi minor 1.1 dapat ditemukan di Revisi Inti (Vulkan 1.1).

Memilih dukungan Vulkan

Perangkat Android harus mendukung set fitur Vulkan paling canggih yang tersedia, asalkan mendukung ABI 64-bit dan tidak memiliki memori rendah.

Perangkat yang diluncurkan dengan Android 13 dan yang lebih baru harus mendukung Vulkan 1.3.

Perangkat yang diluncurkan melalui Android 10 harus mendukung Vulkan 1.1.

Perangkat lain dapat secara opsional mendukung Vulkan 1.3, 1.2, dan 1.1.

Mendukung versi Vulkan

Perangkat Android mendukung versi Vulkan jika kondisi berikut terpenuhi:

  1. Tambahkan driver Vulkan yang mendukung versi Vulkan yang diinginkan (ini harus salah satu dari versi Vulkan 1.3, 1.1, atau 1.0) bersama dengan persyaratan CDD tambahan dari versi Android. Atau, update driver Vulkan yang ada dengan nomor versi Vulkan yang lebih rendah.
  2. Untuk Vulkan 1.3 atau 1.1, Pastikan fitur sistem yang ditampilkan oleh pengelola paket menampilkan true untuk versi vulkan yang benar.
    • Untuk Vulkan 1.3, fiturnya adalah PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000).
    • Untuk Vulkan 1.1, fiturnya adalah PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000).
    Pengelola paket akan menampilkan true untuk Vulkan 1.3 dan Vulkan 1.1 dengan menambahkan aturan, yang ditampilkan sebagai berikut, ke file device.mk yang sesuai.
    • Tambahkan kode berikut untuk 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
      
    • Tambahkan kode berikut untuk 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
      

Profil Dasar Pengukuran Android (ABP)

Sebaiknya semua perangkat Android mematuhi profil Dasar Pengukuran Android 2022 terbaru seperti yang diuraikan dalam panduan profil Dasar Pengukuran Android.

Setiap perangkat yang mendukung Android 14 atau yang lebih tinggi dan Vulkan API, harus memenuhi semua fungsi yang ditentukan dalam profil Dasar Pengukuran Android 2021. Daftar lengkap fungsi yang diperlukan dihitung dalam file json profil Vulkan, tetapi subset utama fungsi yang diperlukan mencakup:

  • Tekstur terkompresi melalui ASTC dan ETC.
  • Ruang warna variabel melalui VK_EXT_swapchain_colorspace.
  • Shading sampel dan interpolasi multisampel melalui sampleRateShading.

Integrasi sistem jendela (WSI)

Di libvulkan.so, driver menerapkan ekstensi integrasi sistem jendela (WSI) berikut:

  • VK_KHR_surface
  • VK_KHR_android_surface
  • VK_KHR_swapchain
  • VK_KHR_driver_properties, diterapkan hanya untuk Vulkan 1.1 di Android 10
  • VK_GOOGLE_display_timing, diterapkan untuk semua versi Vulkan di Android 10

Objek VkSurfaceKHR dan VkSwapchainKHR serta semua interaksi dengan ANativeWindow ditangani oleh platform dan tidak ditampilkan ke driver. Implementasi WSI bergantung pada ekstensi VK_ANDROID_native_buffer, yang harus didukung oleh driver; ekstensi ini hanya digunakan oleh implementasi WSI dan tidak diekspos ke aplikasi.

Flag penggunaan Gralloc

Implementasi Vulkan mungkin memerlukan buffering swapchain untuk dialokasikan dengan flag penggunaan Gralloc pribadi yang ditentukan implementasi. Saat membuat swapchain, Android meminta driver untuk menerjemahkan format yang diminta dan flag penggunaan gambar menjadi flag penggunaan Gralloc dengan memanggil:

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
);

Parameter format dan imageUsage diambil dari struktur VkSwapchainCreateInfoKHR. Pengemudi harus mengisi *grallocConsumerUsage dan *grallocProducerUsage dengan flag penggunaan Gralloc yang diperlukan untuk format dan penggunaan. Flag penggunaan yang ditampilkan oleh driver digabungkan dengan flag penggunaan yang diminta oleh konsumen swapchain saat mengalokasikan buffering.

Android 7.x memanggil VkSwapchainImageUsageFlagsANDROID() versi sebelumnya, yang bernama vkGetSwapchainGrallocUsageANDROID(). Android 8.0 dan yang lebih baru tidak lagi menggunakan vkGetSwapchainGrallocUsageANDROID(), tetapi masih memanggil vkGetSwapchainGrallocUsageANDROID() jika vkGetSwapchainGrallocUsage2ANDROID() tidak disediakan oleh driver:

VkResult VKAPI vkGetSwapchainGrallocUsageANDROID(
    VkDevice            device,
    VkFormat            format,
    VkImageUsageFlags   imageUsage,
    int*                grallocUsage
);

vkGetSwapchainGrallocUsageANDROID() tidak mendukung flag penggunaan swapchain atau flag penggunaan Gralloc yang diperluas.

Gambar yang didukung Gralloc

VkNativeBufferANDROID adalah struktur ekstensi vkCreateImage untuk membuat gambar yang didukung oleh buffering Gralloc. VkNativeBufferANDROID disediakan untuk vkCreateImage() dalam rantai struktur VkImageCreateInfo. Panggilan ke vkCreateImage() dengan VkNativeBufferANDROID terjadi selama panggilan ke vkCreateSwapchainKHR. Implementasi WSI mengalokasikan jumlah buffer native yang diminta untuk swapchain, lalu membuat VkImage untuk setiap buffer tersebut:

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;

Saat membuat gambar yang didukung Gralloc, VkImageCreateInfo memiliki data berikut:

  .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

Di Android 8.0 dan yang lebih tinggi, platform menyediakan struktur ekstensi VkSwapchainImageCreateInfoKHR dalam rantai VkImageCreateInfo yang disediakan ke vkCreateImage saat flag penggunaan image swapchain diperlukan untuk swapchain. Struktur ekstensi berisi flag penggunaan gambar swapchain:

typedef struct {
    VkStructureType                        sType; // must be VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID
    const void*                            pNext;

    VkSwapchainImageUsageFlagsANDROID      usage;
} VkSwapchainImageCreateInfoANDROID;

Di Android 10 dan yang lebih tinggi, platform ini mendukung VK_KHR_swapchain v70, sehingga aplikasi Vulkan dapat membuat VkImage yang didukung oleh memori swapchain. Aplikasi pertama kali memanggil vkCreateImage dengan struktur VkImageSwapchainCreateInfoKHR yang dirantai ke struktur VkImageCreateInfo. Kemudian, aplikasi memanggil vkBindImageMemory2(KHR) dengan struktur VkBindImageMemorySwapchainInfoKHR yang dirantai ke struktur VkBindImageMemoryInfo. imageIndex yang ditentukan dalam struktur VkBindImageMemorySwapchainInfoKHR harus merupakan indeks gambar swapchain yang valid. Sementara itu, platform menyediakan struktur ekstensi VkNativeBufferANDROID dengan informasi buffer Gralloc yang sesuai ke rantai VkBindImageMemoryInfo, sehingga pengemudi mengetahui buffer Gralloc mana yang akan mengikat VkImage.

Mendapatkan gambar

vkAcquireImageANDROID memperoleh kepemilikan gambar swapchain dan mengimpor pagar native yang diberi sinyal secara eksternal ke dalam objek VkSemaphore yang ada dan objek VkFence yang ada:

VkResult VKAPI vkAcquireImageANDROID(
    VkDevice            device,
    VkImage             image,
    int                 nativeFenceFd,
    VkSemaphore         semaphore,
    VkFence             fence
);

vkAcquireImageANDROID() dipanggil selama vkAcquireNextImageKHR untuk mengimpor pagar native ke dalam objek VkSemaphore dan VkFence yang disediakan oleh aplikasi (tetapi, objek semaphore dan pagar opsional dalam panggilan ini). Pengemudi juga dapat menggunakan peluang ini untuk mengenali dan menangani perubahan eksternal pada status buffering Gralloc; banyak pengemudi tidak perlu melakukan apa pun di sini. Panggilan ini menempatkan VkSemaphore dan VkFence ke dalam status tertunda yang sama seolah-olah diberi sinyal oleh vkQueueSubmit, sehingga antrean dapat menunggu semaphore dan aplikasi dapat menunggu pagar.

Kedua objek akan diberi sinyal saat pagar native yang mendasarinya memberikan sinyal; jika pagar native telah memberikan sinyal, semaphore akan berada dalam status yang diberi sinyal saat fungsi ini ditampilkan. Pengemudi mengambil kepemilikan deskriptor file pagar dan menutup deskriptor file pagar saat tidak diperlukan lagi. Pengemudi harus melakukannya meskipun objek semaphore atau pagar tidak disediakan, atau meskipun vkAcquireImageANDROID gagal dan menampilkan error. Jika fenceFd adalah -1, seolah-olah pagar native sudah diberi sinyal.

Merilis gambar

vkQueueSignalReleaseImageANDROID menyiapkan gambar swapchain untuk penggunaan eksternal, membuat pagar native, dan menjadwalkan pagar native untuk diberi sinyal setelah semaphore input telah memberi sinyal:

VkResult VKAPI vkQueueSignalReleaseImageANDROID(
    VkQueue             queue,
    uint32_t            waitSemaphoreCount,
    const VkSemaphore*  pWaitSemaphores,
    VkImage             image,
    int*                pNativeFenceFd
);

vkQueuePresentKHR() memanggil vkQueueSignalReleaseImageANDROID() pada antrean yang disediakan. Pengemudi harus menghasilkan fence native yang tidak memberikan sinyal hingga semua semaphor waitSemaphoreCount dalam sinyal pWaitSemaphores, dan semua pekerjaan tambahan yang diperlukan untuk menyiapkan image agar presentasi selesai.

Jika semaphore tunggu (jika ada) sudah diberi sinyal, dan queue sudah tidak ada aktivitas, driver dapat menetapkan *pNativeFenceFd ke -1, bukan deskripsi file pagar native yang sebenarnya, yang menunjukkan bahwa tidak ada yang perlu ditunggu. Pemanggil memiliki dan menutup deskriptor file yang ditampilkan di *pNativeFenceFd.

Banyak driver yang dapat mengabaikan parameter gambar, tetapi beberapa mungkin perlu menyiapkan struktur data sisi CPU yang terkait dengan buffering Gralloc untuk digunakan oleh konsumen gambar eksternal. Menyiapkan konten buffering untuk digunakan oleh konsumen eksternal harus dilakukan secara asinkron sebagai bagian dari transisi gambar ke VK_IMAGE_LAYOUT_PRESENT_SRC_KHR.

Jika gambar dibuat dengan VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID, pengemudi harus mengizinkan vkQueueSignalReleaseImageANDROID() dipanggil berulang kali tanpa intervensi panggilan ke vkAcquireImageANDROID().

Berbagi dukungan gambar yang dapat dipresentasikan

Beberapa perangkat dapat berbagi kepemilikan satu gambar antara pipeline tampilan dan implementasi Vulkan untuk meminimalkan latensi. Di Android 9 dan yang lebih baru, loader secara kondisional mengiklankan ekstensi VK_KHR_shared_presentable_image berdasarkan respons driver terhadap panggilan ke vkGetPhysicalDeviceProperties2.

Jika driver tidak mendukung Vulkan 1.1 atau ekstensi VK_KHR_physical_device_properties2, loader tidak akan mengiklankan dukungan untuk gambar yang dapat ditampilkan bersama. Jika tidak, loader akan mengkueri kemampuan driver dengan memanggil vkGetPhysicalDeviceProperties2() dan menyertakan struktur berikut dalam rantai VkPhysicalDeviceProperties2::pNext:

typedef struct {
    VkStructureType sType; // must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID
    const void*     pNext;
    VkBool32        sharedImage;
} VkPhysicalDevicePresentationPropertiesANDROID;

Jika driver dapat berbagi kepemilikan gambar dengan sistem layar, driver akan menetapkan anggota sharedImage ke VK_TRUE.

Validasi

OEM dapat menguji implementasi Vulkan menggunakan CTS, yang mencakup hal berikut:

  • Pengujian Kepatuhan Khronos Vulkan di modul CtsDeqpTestCases, yang mencakup pengujian API fungsional untuk Vulkan 1.0, 1.1, 1.2, dan 1.3.
  • Modul CtsGraphicsTestCases, yang menguji apakah perangkat dikonfigurasi dengan benar untuk kemampuan Vulkan yang didukungnya.

Tombol fitur Vulkan

Perangkat yang mendukung Android 11 atau yang lebih tinggi dan mendukung Vulkan API diperlukan untuk mengekspos flag fitur, android.software.vulkan.deqp.level. Nilai flag fitur ini adalah tanggal, yang dienkode sebagai nilai bilangan bulat. File ini menentukan tanggal yang terkait dengan pengujian dEQP Vulkan yang diklaim perangkat telah lulus.

Tanggal dalam format YYYY-MM-DD dienkode sebagai bilangan bulat 32-bit sebagai berikut:

  • Bit 0-15 menyimpan tahun
  • Bit 16-23 menyimpan bulan
  • Bit 24-31 menyimpan hari

Nilai minimum yang diizinkan untuk tombol fitur adalah 0x07E30301, yang sesuai dengan tanggal 01-03-2019, yang merupakan tanggal yang terkait dengan pengujian dEQP Vulkan untuk Android 10. Jika flag fitur setidaknya memiliki nilai ini, perangkat mengklaim lulus semua pengujian dEQP Vulkan Android 10.

Nilai 0x07E40301 sesuai dengan tanggal 01-03-2020, yang merupakan tanggal yang terkait dengan pengujian dEQP Vulkan untuk Android 11. Jika flag fitur setidaknya nilai ini, perangkat mengklaim telah lulus semua pengujian dEQP Vulkan Android 11.

Nilai 0x07E60301 sesuai dengan tanggal 01-03-2022, yang merupakan tanggal yang terkait dengan pengujian dEQP Vulkan untuk Android 13. Jika flag fitur setidaknya memiliki nilai ini, perangkat mengklaim lulus semua pengujian dEQP Vulkan Android 13.

Perangkat yang mengekspos flag fitur tertentu (yaitu 0x07E30301, 0x07E40301, 0x07E60301) mengaku lulus semua pengujian dEQP Android Vulkan dari flag fitur tersebut (masing-masing Android 10, Android 11, Android 13). Perangkat ini mungkin lulus pengujian dEQP Vulkan dari rilis Android yang lebih baru.

dEQP Vulkan merupakan bagian dari Android CTS. Mulai Android 11, komponen runner pengujian dEQP dari CTS menyadari tombol fitur android.software.vulkan.deqp.level, dan melewati semua pengujian dEQP Vulkan yang, menurut tombol fitur ini, perangkat tidak mengklaim mendukung. Pengujian tersebut dilaporkan sebagai lulus dengan mudah.