Menerapkan Vulkan

Vulkan adalah API lintas platform dengan overhead rendah untuk grafis 3D performa tinggi. Seperti OpenGL ES (GLES) , Vulkan menyediakan alat untuk membuat grafik real-time berkualitas tinggi dalam aplikasi. Keuntungan menggunakan Vulkan termasuk pengurangan overhead CPU dan dukungan untuk bahasa Biner Menengah SPIR-V .

Agar berhasil mengimplementasikan Vulkan, perangkat harus menyertakan:

  • Pemuat Vulkan, disediakan oleh Android.
  • Driver Vulkan, disediakan oleh SoC seperti GPU IHV, yang mengimplementasikan Vulkan API . Untuk mendukung fungsionalitas Vulkan, perangkat Android memerlukan perangkat keras GPU berkemampuan Vulkan dan driver terkait. GPU juga harus mendukung GLES 3.1 dan lebih tinggi. Konsultasikan dengan vendor SoC Anda untuk meminta dukungan driver.

Jika perangkat menyertakan driver Vulkan, perangkat perlu 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).

Pemuat vulkan

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

NDK menyertakan pustaka rintisan libvulkan.so untuk penautan. Perpustakaan mengekspor simbol yang sama dengan pemuat. Aplikasi memanggil fungsi yang diekspor dari perpustakaan libvulkan.so asli untuk memasukkan fungsi trampolin ke dalam pemuat, yang dikirim ke lapisan atau driver yang sesuai berdasarkan argumen pertamanya. Panggilan vkGet*ProcAddr() mengembalikan penunjuk fungsi yang dikirim oleh trampolin (yaitu, memanggil langsung ke kode API inti). Memanggil melalui penunjuk fungsi, dibandingkan simbol yang diekspor, lebih efisien karena melewatkan trampolin dan pengiriman.

Pencacahan dan pemuatan pengemudi

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.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 Vulkan hw_module_t membungkus satu struct hw_module_t ; hanya satu driver yang didukung dan string konstan HWVULKAN_DEVICE_0 diteruskan ke open() .

Turunan Vulkan hw_device_t berhubungan dengan satu driver yang dapat mendukung beberapa perangkat fisik. Struktur hw_device_t dapat diperluas hingga 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

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

Saat menggunakan lapisan, perlu diingat bahwa model dan kebijakan keamanan Android berbeda secara signifikan dari platform lain. Secara khusus, Android tidak mengizinkan pemuatan kode eksternal ke dalam proses yang tidak dapat di-debug pada perangkat produksi (yang tidak di-root), juga tidak mengizinkan kode eksternal memeriksa atau mengontrol memori, status, dan sebagainya proses. Ini termasuk larangan menyimpan core dump, jejak API, dan sebagainya ke disk untuk pemeriksaan nanti. Hanya lapisan yang dikirimkan sebagai bagian dari aplikasi yang tidak dapat di-debug yang diaktifkan pada perangkat produksi, dan driver tidak boleh menyediakan fungsionalitas yang melanggar kebijakan ini.

Kasus penggunaan untuk lapisan meliputi:

  • Lapisan waktu pengembangan — Lapisan validasi dan shim untuk alat penelusuran/profiling/debugging tidak boleh dipasang pada citra sistem perangkat produksi. Lapisan validasi dan shim untuk alat penelusuran/profiling/debugging harus dapat diperbarui tanpa citra sistem. Pengembang yang ingin menggunakan salah satu lapisan ini selama pengembangan dapat memodifikasi paket aplikasi, misalnya dengan menambahkan file ke direktori perpustakaan asli mereka. Insinyur IHV dan OEM yang ingin mendiagnosis kegagalan dalam pengiriman aplikasi yang tidak dapat dimodifikasi diasumsikan memiliki akses ke build nonproduksi (yang di-root) dari citra sistem, kecuali aplikasi tersebut dapat di-debug. Untuk informasi lebih lanjut lihat lapisan validasi Vulkan di Android .
  • Lapisan utilitas — Lapisan ini mengekspos ekstensi, seperti lapisan yang mengimplementasikan pengelola memori untuk memori perangkat. Pengembang memilih lapisan, dan versi lapisan tersebut, untuk digunakan dalam aplikasi mereka; aplikasi berbeda yang menggunakan lapisan yang sama mungkin masih menggunakan versi berbeda. Pengembang memilih lapisan mana yang akan dikirimkan dalam paket aplikasi mereka.
  • Lapisan yang disuntikkan (implisit) — Mencakup lapisan seperti kecepatan bingkai, jaringan sosial, dan overlay peluncur game yang disediakan oleh pengguna atau aplikasi lain tanpa sepengetahuan atau izin aplikasi. Ini melanggar kebijakan keamanan Android dan tidak didukung.

Untuk aplikasi yang tidak dapat di-debug, pemuat hanya mencari lapisan di direktori pustaka asli aplikasi dan berupaya memuat pustaka apa pun dengan nama yang cocok dengan pola tertentu (misalnya, libVKLayer_foo.so ).

Untuk aplikasi yang dapat di-debug, pemuat mencari lapisan di /data/local/debug/vulkan dan mencoba memuat pustaka apa pun yang cocok dengan pola tertentu.

Android memungkinkan lapisan untuk di-porting dengan perubahan lingkungan build antara Android dan platform lainnya. Untuk 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

Ikhtisar fungsionalitas Vulkan 1.3

Vulkan 1.3 mengkanonisasi sejumlah ekstensi yang sebelumnya opsional ke dalam fungsionalitas inti Vulkan. Sebagian besar fungsi ini disertakan dengan tujuan meningkatkan kontrol dan perincian pada antarmuka pemrograman Vulkan. Instance render pass single-pass 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 perangkat keras yang sama dengan Vulkan 1.2, 1.1, dan 1.0, dengan sebagian besar implementasi dalam driver grafis khusus SoC, bukan dalam kerangka kerja.

Fitur Vulkan 1.3 yang paling penting untuk Android adalah:

  • Dukungan untuk instance render pass single-pass
  • Dukungan untuk segera menghentikan pemanggilan shader
  • Perincian yang lebih baik dalam pembuatan, pembagian, dan kontrol saluran

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

Ikhtisar fungsionalitas Vulkan 1.2

Vulkan 1.2 menambahkan sejumlah fitur dan ekstensi yang menyederhanakan permukaan API. Ini mencakup Model Memori terpadu dan informasi tambahan yang dapat ditanyakan dari driver perangkat. Vulkan 1.2 memiliki persyaratan perangkat keras yang sama dengan Vulkan 1.0 dan 1.1; semua implementasinya ada dalam driver grafis khusus SoC, bukan kerangka kerja.

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

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

Ikhtisar fungsionalitas Vulkan 1.1

Vulkan 1.1 menyertakan dukungan untuk interop memori/sinkronisasi, yang memungkinkan OEM untuk mendukung Vulkan 1.1 pada perangkat. Selain itu, interop memori/sinkronisasi memungkinkan pengembang menentukan apakah Vulkan 1.1 didukung pada perangkat, dan menggunakannya secara efektif jika didukung. Vulkan 1.1 memiliki persyaratan perangkat keras yang sama dengan Vulkan 1.0, namun sebagian besar implementasinya ada pada driver grafis khusus SOC, bukan dalam kerangka kerja.

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 menyertakan beberapa fitur yang lebih kecil dan peningkatan kegunaan API. Semua perubahan yang dilakukan pada API Vulkan inti dengan sedikit revisi 1.1 dapat ditemukan di Revisi Inti (Vulkan 1.1) .

Pilih dukungan Vulkan

Perangkat Android harus mendukung rangkaian fitur Vulkan tercanggih yang tersedia, asalkan mendukung ABI 64-bit dan memorinya tidak 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 secara opsional dapat mendukung Vulkan 1.3, 1.2, dan 1.1.

Mendukung versi Vulkan

Perangkat Android mendukung versi Vulkan jika ketentuan berikut terpenuhi:

  1. Tambahkan driver Vulkan yang mendukung versi Vulkan yang diinginkan (ini harus salah satu Vulkan versi 1.3, 1.1, atau 1.0) bersama dengan persyaratan CDD tambahan versi Android. Alternatifnya, perbarui driver Vulkan yang ada dengan nomor versi Vulkan yang lebih rendah.
  2. Untuk Vulkan 1.3 atau 1.1, Pastikan fitur sistem yang dikembalikan oleh manajer paket mengembalikan 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) .
    Manajer paket akan mengembalikan true untuk Vulkan 1.3 dan Vulkan 1.1 dengan menambahkan aturan, yang ditunjukkan sebagai berikut, ke file device.mk yang sesuai.
    • Tambahkan yang 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 yang 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 Android (ABP)

Kami mendorong semua perangkat Android untuk mematuhi profil Android Baseline terbaru 2022 sebagaimana diuraikan dalam panduan profil Android Baseline .

Perangkat apa pun yang mendukung Android 14 atau lebih tinggi dan Vulkan API, harus memenuhi semua fungsi yang ditentukan dalam profil Android Baseline 2021 . Daftar lengkap fungsionalitas yang diperlukan disebutkan dalam file json profil Vulkan, namun subset utama dari fungsionalitas yang diperlukan meliputi:

  • 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 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 diekspos 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.

Tanda penggunaan Gralloc

Implementasi Vulkan mungkin memerlukan buffer swapchain untuk dialokasikan dengan tanda penggunaan Gralloc pribadi yang ditentukan implementasi. Saat membuat swapchain, Android meminta driver untuk menerjemahkan format yang diminta dan tanda penggunaan gambar ke dalam tanda 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 tanda penggunaan Gralloc yang diperlukan untuk format dan penggunaan. Flag penggunaan yang dikembalikan oleh driver digabungkan dengan flag penggunaan yang diminta oleh konsumen swapchain saat mengalokasikan buffer.

Android 7.x memanggil versi VkSwapchainImageUsageFlagsANDROID() yang lebih lama, bernama vkGetSwapchainGrallocUsageANDROID() . Android 8.0 dan yang lebih tinggi tidak lagi menggunakan vkGetSwapchainGrallocUsageANDROID() namun tetap memanggil vkGetSwapchainGrallocUsageANDROID() jika vkGetSwapchainGrallocUsage2ANDROID() tidak disediakan oleh driver:

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

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

Gambar yang didukung Gralloc

VkNativeBufferANDROID adalah struktur ekstensi vkCreateImage untuk membuat gambar yang didukung oleh buffer Gralloc. VkNativeBufferANDROID disediakan untuk vkCreateImage() dalam rantai struktur VkImageCreateInfo . Panggilan ke vkCreateImage() dengan VkNativeBufferANDROID terjadi selama panggilan ke vkCreateSwapchainKHR . Implementasi WSI mengalokasikan jumlah buffer asli yang diminta untuk swapchain, lalu membuat VkImage untuk masing-masing 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 ini menyediakan struktur ekstensi VkSwapchainImageCreateInfoKHR dalam rantai VkImageCreateInfo yang disediakan untuk vkCreateImage ketika tanda penggunaan gambar swapchain diperlukan untuk swapchain. Struktur ekstensi berisi tanda 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 lebih tinggi, platform ini 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 dirantai 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 pengemudi mengetahui buffer Gralloc mana yang akan mengikat VkImage .

Dapatkan gambar

vkAcquireImageANDROID memperoleh kepemilikan gambar swapchain dan mengimpor pagar asli yang diberi sinyal eksternal ke 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 asli ke objek VkSemaphore dan VkFence yang disediakan oleh aplikasi (namun, objek semaphore dan pagar bersifat opsional dalam panggilan ini). Pengemudi juga dapat menggunakan kesempatan ini untuk mengenali dan menangani perubahan eksternal apa pun pada status buffer 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 di semaphore dan aplikasi dapat menunggu di pagar.

Kedua objek menjadi diberi sinyal ketika pagar asli yang mendasarinya memberi sinyal; jika pagar asli telah memberi sinyal, maka semaphore berada dalam status sinyal ketika fungsi ini kembali. Pengemudi mengambil alih kepemilikan deskriptor file pagar dan menutup deskriptor file pagar bila tidak lagi diperlukan. Pengemudi harus melakukannya meskipun objek semaphore atau pagar tidak disediakan, atau bahkan jika vkAcquireImageANDROID gagal dan mengembalikan kesalahan. Jika fenceFd adalah -1, seolah-olah pagar asli sudah diberi sinyal.

Rilis gambar

vkQueueSignalReleaseImageANDROID menyiapkan gambar swapchain untuk penggunaan eksternal, membuat pagar asli, dan menjadwalkan pagar asli untuk diberi sinyal setelah semafor masukan 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 pagar asli yang tidak memberi sinyal sampai semua semafor waitSemaphoreCount dalam sinyal pWaitSemaphores , dan pekerjaan tambahan apa pun yang diperlukan untuk menyiapkan image untuk presentasi selesai.

Jika semaphore tunggu (jika ada) sudah memberi sinyal, dan queue sudah menganggur, pengemudi dapat menyetel *pNativeFenceFd ke -1 alih-alih deskriptor file pagar asli sebenarnya, yang menunjukkan bahwa tidak ada yang perlu ditunggu. Penelepon memiliki dan menutup deskriptor file yang dikembalikan dalam *pNativeFenceFd .

Banyak driver yang dapat mengabaikan parameter image, namun beberapa driver mungkin perlu menyiapkan struktur data sisi CPU yang terkait dengan buffer Gralloc untuk digunakan oleh konsumen image eksternal. Mempersiapkan 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 , maka driver harus mengizinkan vkQueueSignalReleaseImageANDROID() dipanggil berulang kali tanpa mengintervensi panggilan ke vkAcquireImageANDROID() .

Berbagi dukungan gambar yang rapi

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

Jika driver tidak mendukung ekstensi Vulkan 1.1 atau VK_KHR_physical_device_properties2 , loader tidak mengiklankan dukungan untuk gambar bersama yang dapat dipresentasikan. Jika tidak, pemuat akan menanyakan 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 tampilan, ia akan menetapkan anggota sharedImage ke VK_TRUE .

Validasi

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

  • Pengujian Kesesuaian Khronos Vulkan dalam 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.

Bendera fitur Vulkan

Perangkat yang mendukung Android 11 atau lebih tinggi dan mendukung Vulkan API harus mengekspos tanda fitur, android.software.vulkan.deqp.level . Nilai tanda fitur ini adalah tanggal, yang dikodekan sebagai nilai integer. Ini menentukan tanggal yang terkait dengan pengujian Vulkan dEQP yang diklaim lulus oleh perangkat.

Tanggal dalam bentuk YYYY-MM-DD dikodekan sebagai bilangan bulat 32-bit sebagai berikut:

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

Nilai minimum yang diperbolehkan untuk tanda fitur adalah 0x07E30301 , yang sesuai dengan tanggal 01-03-2019, yaitu tanggal yang terkait dengan pengujian Vulkan dEQP untuk Android 10. Jika tanda fitur setidaknya bernilai ini, perangkat akan mengklaim lulus semua tes Android 10 Vulkan dEQP.

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

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

Perangkat yang menampilkan tanda fitur tertentu ( yaitu 0x07E30301 , 0x07E40301 , 0x07E60301 ) mengklaim lulus semua pengujian dEQP Android Vulkan dari tanda fitur tersebut (masing-masing Android 10, Android 11, Android 13). Perangkat ini mungkin lulus pengujian Vulkan dEQP dari rilis Android selanjutnya.

Vulkan dEQP merupakan bagian dari Android CTS. Mulai Android 11, komponen test runner dEQP dari CTS mengetahui tanda fitur android.software.vulkan.deqp.level , dan melewati semua pengujian Vulkan dEQP yang - menurut tanda fitur ini - tidak diklaim didukung oleh perangkat. Tes semacam itu dilaporkan lulus begitu saja.