Mengimplementasikan Vulkan

Vulkan adalah API lintas platform dengan overhead rendah untuk grafis 3D berperforma tinggi. Seperti OpenGL ES (GLES), Vulkan menyediakan alat untuk membuat grafis real-time berkualitas tinggi dalam aplikasi. Keuntungan 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 mengimplementasikan Vulkan API. Untuk mendukung fungsi Vulkan, perangkat Android memerlukan hardware GPU yang kompatibel dengan 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 secara akurat mencerminkan kemampuan perangkat. Hal ini membantu memastikan bahwa perangkat mematuhi Compatibility Definition Document (CDD).

Pemuat Vulkan

Loader Vulkan platform/frameworks/native/vulkan adalah antarmuka utama antara aplikasi Vulkan dan driver Vulkan perangkat. Loader Vulkan diinstal di /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 (WSI) Windows 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 yang sebenarnya untuk memasukkan fungsi trampoline di loader, yang mengirim ke lapisan atau driver yang sesuai berdasarkan argumen pertamanya. Panggilan vkGet*ProcAddr() mengembalikan pointer fungsi yang dikirimkan trampolin (yaitu, panggilan langsung ke kode API inti). Memanggil melalui pointer fungsi, bukan simbol yang diekspor, lebih efisien karena melewati trampoline dan pengiriman.

Pencacahan dan pemuatan driver

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

/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

Di Android 7.0 dan yang lebih tinggi, turunan hw_module_t Vulkan membungkus satu struct hw_module_t; hanya satu driver yang didukung dan string konstanta 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() dari struktur hw_device_t.

Mulai Android 15, loader mendukung APEX untuk memuat driver Vulkan. Tetapkan ro.vulkan.apex ke nama APEX Vulkan untuk memuat Vulkan dari APEX.

Penemuan dan pemuatan lapisan

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

Saat menggunakan lapisan, perlu diingat bahwa model dan kebijakan keamanan Android sangat berbeda dengan platform lain. Secara khusus, Android tidak mengizinkan pemuatan kode eksternal ke dalam proses yang tidak dapat di-debug pada perangkat produksi (non-root), dan tidak mengizinkan kode eksternal untuk memeriksa atau mengontrol memori, status, dan sebagainya dari proses tersebut. Hal ini mencakup larangan menyimpan core dump, rekaman aktivitas API, dan sebagainya ke disk untuk diperiksa nanti. Hanya lapisan yang dikirim 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/pen-debug-an tidak boleh diinstal pada image sistem perangkat produksi. Lapisan validasi dan shim untuk alat tracing/pembuatan profil/pen-debug-an harus dapat diupdate tanpa image sistem. Developer yang ingin menggunakan salah satu lapisan ini selama pengembangan dapat mengubah paket aplikasi, misalnya, dengan menambahkan file ke direktori library native mereka. Teknisi IHV dan OEM yang ingin mendiagnosis kegagalan dalam pengiriman aplikasi yang tidak dapat diubah diasumsikan memiliki akses ke build image sistem non-produksi (ber-root), kecuali jika aplikasi tersebut dapat di-debug. Untuk mengetahui informasi selengkapnya, lihat Lapisan validasi Vulkan di Android.
  • Lapisan utilitas — Lapisan ini mengekspos ekstensi, seperti lapisan yang menerapkan pengelola memori untuk memori perangkat. Developer memilih lapisan, dan versi lapisan tersebut, untuk digunakan di aplikasinya; aplikasi yang berbeda yang menggunakan lapisan yang sama mungkin masih menggunakan versi yang berbeda. Developer memilih lapisan mana yang akan dikirimkan dalam paket aplikasi mereka.
  • Lapisan yang disisipkan (implisit) — Mencakup lapisan seperti frame rate, jaringan sosial, dan overlay peluncur game yang disediakan oleh pengguna atau beberapa aplikasi lain tanpa sepengetahuan atau izin aplikasi. Hal 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 menelusuri lapisan di /data/local/debug/vulkan dan mencoba memuat library yang cocok dengan pola tertentu.

Android memungkinkan lapisan di-porting dengan perubahan lingkungan build antara Android dan platform lainnya. Untuk mengetahui detail tentang antarmuka antara lapisan dan pemuat, lihat Arsitektur Antarmuka Pemuat Vulkan. 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 maksud untuk meningkatkan kontrol dan perincian atas antarmuka pemrograman Vulkan. Instance render pass satu lintasan tidak lagi memerlukan objek render pass atau framebuffer. Jumlah total objek status pipeline dapat dikurangi, dan sinkronisasi dalam API dirombak. Vulkan 1.3 memiliki persyaratan hardware yang sama dengan Vulkan 1.2, 1.1, dan 1.0, dengan sebagian besar implementasi berada di driver grafis khusus SoC, bukan di framework.

Fitur Vulkan 1.3 yang paling penting untuk Android adalah:

  • Dukungan untuk instance pass render satu kali
  • Dukungan untuk menghentikan pemanggilan shader secara langsung
  • Granularitas yang lebih baik atas pembuatan, berbagi, dan kontrol pipeline

Vulkan 1.3 juga mencakup beberapa fitur yang lebih kecil dan peningkatan kegunaan API. Semua perubahan yang dilakukan pada Vulkan API inti dengan revisi kecil 1.3 dapat ditemukan di Revisi Inti (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 implementasinya ada 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 mencakup beberapa fitur yang lebih kecil dan peningkatan kegunaan API. Semua perubahan yang dilakukan pada Vulkan API inti dengan revisi kecil 1.2 dapat ditemukan di Revisi Inti (Vulkan 1.2).

Ringkasan fungsi Vulkan 1.1

Vulkan 1.1 mencakup dukungan untuk interoperabilitas sinkronisasi/memori, yang memungkinkan OEM mendukung Vulkan 1.1 di perangkat. Selain itu, interoperabilitas sinkronisasi/memori memungkinkan developer 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 buffer 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 kecil 1.1 dapat ditemukan di Revisi Inti (Vulkan 1.1).

Memilih dukungan Vulkan

Perangkat Android harus mendukung set fitur Vulkan tercanggih yang tersedia, asalkan perangkat tersebut mendukung ABI 64-bit dan bukan perangkat memori rendah.

Perangkat yang diluncurkan dengan Android 13 dan yang lebih tinggi 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 (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, seperti yang ditunjukkan di bawah, 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 dijelaskan dalam panduan profil Dasar Pengukuran Android.

Semua 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 tercantum 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 mengimplementasikan ekstensi integrasi sistem jendela (WSI) berikut:

  • VK_KHR_surface
  • VK_KHR_android_surface
  • VK_KHR_swapchain
  • VK_KHR_driver_properties, diimplementasikan untuk Vulkan 1.1 di Android 10 saja
  • VK_GOOGLE_display_timing, diimplementasikan untuk versi Vulkan apa pun di Android 10

Objek VkSurfaceKHR dan VkSwapchainKHR serta semua interaksi dengan ANativeWindow ditangani oleh platform dan tidak diekspos ke driver. Implementasi WSI mengandalkan 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 buffer 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 ke dalam 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. Driver 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 buffer.

Android 7.x memanggil versi VkSwapchainImageUsageFlagsANDROID() sebelumnya, yang bernama vkGetSwapchainGrallocUsageANDROID(). Android 8.0 dan yang lebih baru menghentikan penggunaan vkGetSwapchainGrallocUsageANDROID(), tetapi tetap 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 buffer Gralloc. VkNativeBufferANDROID diberikan kepada 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:

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 diberikan ke vkCreateImage saat flag penggunaan gambar 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 mendukung VK_KHR_swapchain v70, sehingga aplikasi Vulkan dapat membuat VkImage yang didukung oleh memori swapchain. Aplikasi pertama-tama memanggil vkCreateImage dengan struktur VkImageSwapchainCreateInfoKHR yang dirangkai ke struktur VkImageCreateInfo. Kemudian, aplikasi memanggil vkBindImageMemory2(KHR) dengan struktur VkBindImageMemorySwapchainInfoKHR yang dirangkai ke struktur VkBindImageMemoryInfo. imageIndex yang ditentukan dalam struktur VkBindImageMemorySwapchainInfoKHR harus berupa indeks gambar swapchain yang valid. Sementara itu, platform menyediakan struktur ekstensi VkNativeBufferANDROID dengan informasi buffer Gralloc yang sesuai ke rantai VkBindImageMemoryInfo, sehingga driver mengetahui buffer Gralloc mana yang akan diikat dengan VkImage.

Mendapatkan gambar

vkAcquireImageANDROID mendapatkan 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 objek VkSemaphore dan VkFence yang disediakan oleh aplikasi (namun, objek semaphore dan pagar bersifat opsional dalam panggilan ini). Driver juga dapat menggunakan kesempatan ini untuk mengenali dan menangani setiap perubahan eksternal pada status buffer Gralloc; banyak driver 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 penghalang.

Kedua objek akan diberi sinyal saat sinyal pagar native yang mendasarinya; jika pagar native telah diberi sinyal, maka semafor berada dalam status diberi sinyal saat fungsi ini ditampilkan. Driver mengambil kepemilikan deskriptor file fence dan menutup deskriptor file fence saat tidak lagi diperlukan. Driver harus melakukannya meskipun objek semaphore atau pagar tidak disediakan, atau bahkan jika vkAcquireImageANDROID gagal dan menampilkan error. Jika fenceFd adalah -1, seolah-olah pagar virtual 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 diberi sinyal:

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

Panggilan vkQueuePresentKHR() vkQueueSignalReleaseImageANDROID() pada antrean yang disediakan. Driver harus menghasilkan pagar native yang tidak memberi sinyal hingga semua semafor waitSemaphoreCount dalam pWaitSemaphores memberi sinyal, dan semua tugas tambahan yang diperlukan untuk menyiapkan image untuk presentasi selesai.

Jika semafor tunggu (jika ada) sudah diberi sinyal, dan queue sudah tidak ada aktivitas, driver dapat menyetel *pNativeFenceFd ke -1, bukan deskriptor 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 dapat mengabaikan parameter gambar, tetapi beberapa driver mungkin perlu menyiapkan struktur data sisi CPU yang terkait dengan buffer Gralloc untuk digunakan oleh konsumen gambar eksternal. Menyiapkan konten buffer 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 panggilan intervensi ke vkAcquireImageANDROID().

Dukungan gambar yang dapat ditampilkan bersama

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

Jika driver tidak mendukung Vulkan 1.1 atau ekstensi VK_KHR_physical_device_properties2, pemuat tidak mengiklankan dukungan untuk gambar yang dapat ditampilkan bersama. Jika tidak, loader akan membuat kueri 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 membagikan kepemilikan gambar dengan sistem layar, driver akan menyetel anggota sharedImage ke VK_TRUE.

Validasi

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

  • Uji Kepatuhan Vulkan Khronos dalam modul CtsDeqpTestCases, yang mencakup uji 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 yang mendukung Vulkan API diperlukan untuk mengekspos tanda fitur, android.software.vulkan.deqp.level. Nilai tanda fitur ini adalah tanggal, yang dienkode sebagai nilai bilangan bulat. Menentukan tanggal yang terkait dengan pengujian dEQP Vulkan yang diklaim lulus oleh perangkat.

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 tanda fitur adalah 0x07E30301, yang sesuai dengan tanggal 01-03-2019, yaitu tanggal yang terkait dengan pengujian dEQP Vulkan untuk Android 10. Jika tanda fitur setidaknya memiliki nilai ini, perangkat mengklaim lulus semua pengujian dEQP Vulkan Android 10.

Nilai 0x07E40301 sesuai dengan tanggal 1 Maret 2020, yang merupakan tanggal yang terkait dengan pengujian dEQP Vulkan untuk Android 11. Jika tanda fitur setidaknya memiliki nilai ini, perangkat tersebut diklaim lulus semua pengujian dEQP Vulkan Android 11.

Nilai 0x07E60301 sesuai dengan tanggal 1 Maret 2022, yang merupakan tanggal yang terkait dengan pengujian dEQP Vulkan untuk Android 13. Jika tanda fitur setidaknya memiliki nilai ini, perangkat menyatakan lulus semua pengujian dEQP Vulkan Android 13.

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

dEQP Vulkan merupakan bagian dari CTS Android. Mulai Android 11, komponen pelaksana pengujian dEQP CTS mengetahui tanda fitur android.software.vulkan.deqp.level, dan melewati pengujian dEQP Vulkan yang - menurut tanda fitur ini - tidak diklaim didukung oleh perangkat. Pengujian tersebut dilaporkan lulus dengan mudah.