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:
- 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.
- 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)
.
true
untuk Vulkan 1.3 dan Vulkan 1.1 dengan menambahkan aturan, yang ditampilkan sebagai berikut, ke filedevice.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
- Untuk Vulkan 1.3, fiturnya adalah
- 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 10VK_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.