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
.
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:
- 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.
- 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, seperti yang ditunjukkan di bawah, 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 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 sajaVK_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.