Vulkan adalah overhead yang rendah, API lintas platform untuk 3D berperforma tinggi grafis. Seperti OpenGL ES (GLES), Vulkan menyediakan alat untuk membuat grafis real-time dalam aplikasi. Keuntungan menggunakan Vulkan mencakup pengurangan CPU overhead 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, Android perangkat Anda memerlukan hardware GPU yang mendukung Vulkan dan driver yang terkait. GPU juga harus mendukung GLES 3.1 dan yang lebih tinggi. Konsultasikan dengan vendor SoC untuk meminta dukungan pengemudi.
Jika perangkat menyertakan driver Vulkan, perangkat harus mendeklarasikan
FEATURE_VULKAN_HARDWARE_LEVEL
dan
fitur sistem FEATURE_VULKAN_HARDWARE_VERSION
, dengan versi yang
secara akurat mencerminkan
kemampuan perangkat. Hal ini membantu memastikan bahwa
perangkat mematuhi
Compatibility Definition Document (CDD).
Loader Vulkan
Loader Vulkan platform/frameworks/native/vulkan
adalah
antarmuka utama antara aplikasi Vulkan dan driver Vulkan perangkat. Vulkan
loader diinstal pada /system/lib[64]/libvulkan.so
. Loader
menyediakan titik entri Vulkan API inti, titik entri ekstensi
diperlukan oleh Android CDD, dan banyak ekstensi opsional tambahan. Jendela
Ekstensi Integrasi Sistem (WSI) diekspor oleh loader dan terutama
diimplementasikan pada loader, bukan di driver. Loader juga mendukung
menghitung dan memuat lapisan yang dapat mengekspos ekstensi tambahan dan mencegat
panggilan API inti dalam
perjalanannya ke {i>driver<i}.
NDK menyertakan library libvulkan.so
stub untuk
penautan. Library ini mengekspor simbol yang sama dengan loader. Aplikasi memanggil fungsi
diekspor dari library libvulkan.so
asli ke
masukkan fungsi trampolin di loader, yang mengirim ke alamat
{i>layer<i} atau {i>driver<i} berdasarkan
argumen pertama mereka. vkGet*ProcAddr()
panggilan mengembalikan penunjuk fungsi yang menjadi tujuan pengiriman trampolin (yaitu,
dipanggil langsung ke dalam kode API inti). Memanggil melalui fungsi
{i>pointer<i}, daripada simbol yang diekspor, lebih efisien karena
melewati trampolin dan mengirim sinyal.
Enumerasi dan pemuatan pengemudi
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 {i>driver<i}. Jalur yang 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
HWVULKAN_DEVICE_0
diteruskan ke open()
.
Turunan hw_device_t
Vulkan sesuai dengan satu
{i>driver<i} yang dapat mendukung
banyak perangkat fisik. Tujuan
Struktur hw_device_t
dapat diperluas untuk mengekspor
vkGetGlobalExtensionProperties()
, vkCreateInstance()
, dan
Fungsi vkGetInstanceProcAddr()
. Loader bisa menemukan semua
VkInstance()
, VkPhysicalDevice()
, dan
fungsi vkGetDeviceProcAddr()
dengan memanggil
vkGetInstanceProcAddr()
dari struktur hw_device_t
.
Penemuan dan pemuatan lapisan
Loader Vulkan mendukung enumerasi dan pemuatan lapisan yang dapat mengekspos ekstensi tambahan dan menangkap panggilan API inti dalam perjalanan ke {i>driver<i}. Android tidak menyertakan lapisan pada image sistem; namun, aplikasi dapat menyertakan lapisan dalam APK-nya.
Saat menggunakan lapisan, perlu diingat bahwa model keamanan dan kebijakan Android sangat berbeda dengan platform lainnya. Secara khusus, Android tidak mengizinkan memuat kode eksternal ke dalam proses yang tidak dapat di-debug pada produksi (non-root) perangkat input, dan juga tidak memungkinkan kode eksternal untuk memeriksa atau mengontrol kunci memori, status, dan sebagainya. Hal ini mencakup larangan menyimpan dump core, API jejak, dan sebagainya ke {i>disk<i} untuk diperiksa nanti. Hanya lapisan yang dikirim sebagai bagian dari aplikasi yang tidak dapat di-debug diaktifkan di perangkat produksi, dan driver tidak boleh memberikan fungsionalitas yang melanggar kebijakan tersebut.
Kasus penggunaan untuk lapisan mencakup:
- Lapisan waktu pengembangan — Validasi lapisan dan shim untuk alat pelacakan/pembuatan profil/proses debug tidak boleh diinstal {i>image<i} sistem dari perangkat produksi. Lapisan dan shim validasi untuk alat pelacakan/profil/proses debug harus dapat diperbarui tanpa sistem gambar. Pengembang yang ingin menggunakan {i>tool<i} lapisan ini selama pengembangan dapat memodifikasi paket aplikasi, misalnya, dengan menambahkan file ke direktori library native-nya. Insinyur IHV dan OEM yang ingin mendiagnosis kegagalan dalam pengiriman aplikasi yang tidak dapat diubah diasumsikan memiliki akses ke build nonproduksi (di-root) image sistem, kecuali aplikasi tersebut dapat di-debug. Untuk mengetahui informasi selengkapnya, lihat Lapisan validasi Vulkan di Android.
- Lapisan utilitas — Lapisan ini mengekspos ekstensi, seperti lapisan yang mengimplementasikan {i>memory manager<i} untuk memori perangkat. Pengembang memilih lapisan, dan versi lapisan tersebut, untuk digunakan di aplikasi; aplikasi lain yang menggunakan lapisan yang sama mungkin masih menggunakan versi yang berbeda. Pengembang memilih lapisan mana yang akan dikirimkan dalam paket aplikasi Google Cloud.
- Lapisan yang diinjeksikan (implisit) — Mencakup lapisan seperti overlay kecepatan frame, jaringan sosial, dan peluncur game yang disediakan oleh pengguna atau aplikasi lain tanpa sepengetahuan atau persetujuan aplikasi. Ini melanggar kebijakan keamanan Android dan tidak didukung.
Untuk aplikasi yang tidak dapat di-debug, loader hanya akan menelusuri lapisan di bagian
direktori library native aplikasi dan mencoba memuat library apa pun dengan nama
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
pola tertentu.
Android memungkinkan lapisan ditransfer dengan perubahan lingkungan build antara Android dan platform lainnya. Untuk detail tentang antarmuka antarlapisan dan , lihat Arsitektur Antarmuka Loader Vulkan. Organisasi yang dikelola Khronos lapisan validasi 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 untuk meningkatkan kontrol dan perincian atas antarmuka pemrograman Vulkan. Instance penerusan render single-pass tidak lagi memerlukan {i>render pass<i} atau {i>framebuffer<i}. 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 di driver grafis khusus SoC, dalam kerangka kerja.
Fitur Vulkan 1.3 yang paling penting untuk Android adalah:
- Dukungan untuk instance penerusan render single-pass
- Dukungan untuk segera menghentikan pemanggilan shader
- Perincian yang lebih baik atas pembuatan, pembagian, dan kontrol pipeline
Vulkan 1.3 juga menyertakan beberapa fitur yang lebih kecil dan peningkatan kegunaan API. Semua perubahan yang dibuat ke Vulkan API inti dengan revisi minor 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 Memory Model 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 pada {i>driver<i} grafis khusus SoC, bukan dalam kerangka kerja.
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 dibuat ke Vulkan API inti dengan revisi minor 1.2 dapat ditemukan di Revisi Inti (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 kapan waktunya. Vulkan 1.1 memiliki persyaratan perangkat keras yang sama dengan Vulkan 1.0, tetapi sebagian besar dalam driver grafis khusus SOC, bukan dalam framework.
Fitur Vulkan 1.1 yang paling penting untuk Android adalah:
- Dukungan untuk mengimpor dan mengekspor buffer memori dan sinkronisasi objek 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 dibuat ke Vulkan API inti dengan revisi minor 1.1 dapat ditemukan di Revisi Inti (Vulkan 1.1).
Pilih dukungan Vulkan
Perangkat Android harus mendukung set fitur Vulkan paling canggih yang tersedia, asalkan perangkat tersebut 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:
- Menambahkan driver Vulkan yang mendukung versi Vulkan yang diinginkan (ini harus berupa salah satu versi Vulkan 1.3, 1.1, atau 1.0) bersama dengan persyaratan CDD tambahan 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
PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000)
. - Untuk Vulkan 1.1, fiturnya
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 hal 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
- Tambahkan hal 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)
Kami mendorong semua perangkat Android agar sesuai dengan profil Dasar Pengukuran Android 2022 terbaru karena diuraikan dalam Panduan profil Dasar Pengukuran Android.
Perangkat apa pun yang mendukung Android 14 atau yang lebih tinggi dan Vulkan API harus
memenuhi semua fungsionalitas yang didefinisikan dalam
Profil Dasar Pengukuran Android 2021. Daftar lengkap fungsi
yang diperlukan adalah
disebutkan dalam file json
profil Vulkan, tetapi subset utama yang diperlukan
fungsionalitasnya meliputi:
- Tekstur terkompresi melalui ASTC dan ETC.
- Ruang warna variabel hingga
VK_EXT_swapchain_colorspace
. - Sampel shading dan interpolasi multisampel melalui
sampleRateShading
.
Integrasi sistem jendela (WSI)
Di libvulkan.so
, driver mengimplementasikan hal berikut
ekstensi integrasi sistem jendela (WSI):
VK_KHR_surface
VK_KHR_android_surface
VK_KHR_swapchain
VK_KHR_driver_properties
, diimplementasikan untuk Vulkan 1.1 di Khusus Android 10VK_GOOGLE_display_timing
, diterapkan untuk semua versi Vulkan di Android 10
Objek VkSurfaceKHR
dan VkSwapchainKHR
, dan semua
interaksi dengan ANativeWindow
ditangani oleh platform dan tidak
terbuka bagi pengemudi. Penerapan WSI bergantung pada
VK_ANDROID_native_buffer
, yang harus
didukung oleh pengemudi; ekstensi ini hanya digunakan oleh implementasi WSI
dan tidak diekspos ke aplikasi.
Tanda penggunaan Gralloc
Implementasi Vulkan mungkin memerlukan alokasi buffer swapchain dengan flag penggunaan Gralloc pribadi yang ditentukan implementasi. Saat membuat swapchain, Android meminta driver untuk menerjemahkan format yang diminta dan 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
dari struktur VkSwapchainCreateInfoKHR
. Pengemudi harus mengisi
*grallocConsumerUsage
dan *grallocProducerUsage
dengan
tanda penggunaan Gralloc yang
diperlukan untuk format tersebut
dan penggunaannya. Tanda penggunaan yang ditampilkan oleh driver digabungkan dengan tingkat penggunaan
yang diminta oleh konsumen swapchain saat mengalokasikan buffer.
Android 7.x memanggil VkSwapchainImageUsageFlagsANDROID()
versi sebelumnya,
bernama vkGetSwapchainGrallocUsageANDROID()
. Android 8.0 dan yang lebih tinggi tidak akan digunakan lagi
vkGetSwapchainGrallocUsageANDROID()
tetapi tetap menelepon
vkGetSwapchainGrallocUsageANDROID()
jika
vkGetSwapchainGrallocUsage2ANDROID()
tidak disediakan oleh pengemudi:
VkResult VKAPI vkGetSwapchainGrallocUsageANDROID( VkDevice device, VkFormat format, VkImageUsageFlags imageUsage, int* grallocUsage );
vkGetSwapchainGrallocUsageANDROID()
tidak mendukung penggunaan swapchain
atau penanda penggunaan Gralloc yang diperluas.
Gambar yang didukung Gralloc
VkNativeBufferANDROID
adalah ekstensi vkCreateImage
untuk membuat gambar yang didukung oleh buffer Gralloc. VkNativeBufferANDROID
sama dengan
diberikan ke vkCreateImage()
dalam VkImageCreateInfo
struktur rantai. Panggilan ke vkCreateImage()
dengan VkNativeBufferANDROID
dilakukan
selama panggilan ke vkCreateSwapchainKHR
. Implementasi WSI mengalokasikan
jumlah buffer native yang diminta untuk swapchain, kemudian membuat
VkImage
untuk masing-masing:
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
Pada Android 8.0 dan yang lebih tinggi, platform menyediakan
Struktur ekstensi VkSwapchainImageCreateInfoKHR
di
Rantai VkImageCreateInfo
diberikan ke vkCreateImage
saat tanda 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
didukung oleh memori swapchain. Aplikasi pertama kali memanggil
vkCreateImage
dengan VkImageSwapchainCreateInfoKHR
dirantai ke struktur VkImageCreateInfo
. Kemudian,
aplikasi memanggil vkBindImageMemory2(KHR)
dengan
Struktur VkBindImageMemorySwapchainInfoKHR
dirantai ke
VkBindImageMemoryInfo
. imageIndex
ditentukan dalam struktur VkBindImageMemorySwapchainInfoKHR
harus
memiliki indeks gambar swapchain yang valid. Sementara itu, platform ini menyediakan
VkNativeBufferANDROID
dengan struktur ekstensi
Informasi buffer Gralloc ke rantai VkBindImageMemoryInfo
, jadi
driver mengetahui buffer Gralloc mana
yang akan mengikat VkImage
.
Mendapatkan gambar
vkAcquireImageANDROID
mengakuisisi kepemilikan gambar swapchain
dan mengimpor pagar native yang diberi sinyal eksternal ke dalam server
Objek VkSemaphore
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 (tetapi objek semafor dan fence
opsional dalam panggilan ini). Pengemudi juga dapat menggunakan
kesempatan ini untuk mengenali
dan menangani setiap perubahan eksternal pada
status buffer Gralloc; banyak pengemudi tidak akan
perlu melakukan apa pun di sini. Panggilan ini menempatkan VkSemaphore
dan
VkFence
ke dalam status tertunda yang sama
seolah diberi sinyal oleh vkQueueSubmit
,
sehingga antrean dapat menunggu di semaphore dan aplikasi dapat menunggu di fence.
Kedua objek menjadi sinyal saat fence native yang mendasarinya memberikan sinyal; jika
pagar asli sudah memberikan sinyal, maka semafor berada di dalam sinyal
status saat fungsi ini ditampilkan. Pengemudi mengambil alih kepemilikan file fence
dan menutup deskriptor file fence saat tidak lagi diperlukan. Pengemudi
harus melakukannya bahkan jika tidak ada objek semaphore atau fence yang disediakan, atau bahkan jika
vkAcquireImageANDROID
gagal dan menampilkan error. Jika
fenceFd
adalah -1, seolah-olah fence native sudah
diberi sinyal.
Gambar rilis
vkQueueSignalReleaseImageANDROID
menyiapkan gambar swapchain untuk
penggunaan eksternal, membuat fence native, dan menjadwalkan fence native untuk diberi sinyal setelah
semaphora input telah memberikan sinyal:
VkResult VKAPI vkQueueSignalReleaseImageANDROID( VkQueue queue, uint32_t waitSemaphoreCount, const VkSemaphore* pWaitSemaphores, VkImage image, int* pNativeFenceFd );
vkQueuePresentKHR()
memanggil vkQueueSignalReleaseImageANDROID()
di antrean yang disediakan. Pengemudi harus membuat pagar asli yang tidak memberikan sinyal
hingga ke-waitSemaphoreCount
semafor di
Sinyal pWaitSemaphores
, dan pekerjaan tambahan apa pun yang diperlukan untuk
mempersiapkan image
sebelum presentasi selesai.
Jika semafora tunggu (jika ada) sudah diberi sinyal, dan queue
adalah
tidak ada aktivitas, pengemudi dapat menyetel *pNativeFenceFd
ke -1
, bukan deskriptor file fence native yang sebenarnya, yang menunjukkan bahwa
maka tidak ada yang perlu ditunggu. Pemanggil memiliki dan menutup deskriptor file
ditampilkan di *pNativeFenceFd
.
Banyak pengemudi dapat mengabaikan parameter gambar, tetapi beberapa mungkin perlu mempersiapkan
Struktur data sisi CPU yang terkait dengan buffer Gralloc untuk digunakan oleh perangkat eksternal
konsumen gambar. Menyiapkan konten buffer untuk digunakan oleh konsumen eksternal harus
dilakukan secara asinkron sebagai bagian dari proses transisi gambar ke
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
.
Jika gambar dibuat dengan
VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID
, maka pengemudi harus
memungkinkan vkQueueSignalReleaseImageANDROID()
untuk 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.
Pada Android 9 dan yang lebih tinggi, loader secara kondisional mengiklankan
VK_KHR_shared_presentable_image
ekstensi berdasarkan
Respons terhadap panggilan ke vkGetPhysicalDeviceProperties2
.
Jika driver tidak mendukung Vulkan 1.1 atau
VK_KHR_physical_device_properties2
, loader tidak
mengiklankan dukungan untuk gambar yang rapi dan dibagikan. Jika tidak, kueri loader
kemampuan pengemudi 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;
Apakah pengemudi dapat berbagi kepemilikan gambar dengan layar
sistem, tindakan ini akan menetapkan
anggota sharedImage
ke VK_TRUE
.
Validasi
OEM dapat menguji implementasi Vulkan menggunakan CTS, yang mencakup hal berikut:
- Pengujian Kesesuaian Vulkan dari Khronos
dalam modul
CtsDeqpTestCases
, yang mencakup pengujian API fungsional untuk Vulkan 1.0, 1.1, 1.2, dan 1.3. - Modul
CtsGraphicsTestCases
, yang menguji bahwa 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 tombol fitur,
android.software.vulkan.deqp.level
. Nilai tombol fitur ini
adalah tanggal, yang dienkode sebagai nilai bilangan bulat. Ini menentukan tanggal yang terkait dengan
dEQP Vulkan menguji yang diklaim perangkat
untuk lulus.
Tanggal dalam format YYYY-MM-DD dienkode sebagai bilangan bulat 32-bit sebagai berikut:
- Bit 0-15 menyimpan tahun
- Bits 16-23 menyimpan bulan
- Bit 24-31 menyimpan hari ini
Nilai minimum yang diizinkan untuk tombol fitur adalah 0x07E30301
,
yang sesuai dengan tanggal 2019-03-01, yang merupakan tanggal yang terkait dengan
Pengujian dEQP Vulkan untuk Android 10. Jika penanda fitur
setidaknya memiliki nilai ini,
perangkat mengklaim lulus semua pengujian dEQP Vulkan Android 10.
Nilai 0x07E40301
sesuai dengan tanggal 01-03-2020, yaitu
tanggal yang terkait dengan pengujian dEQP Vulkan untuk Android 11. Jika fitur
minimal adalah nilai ini, perangkat mengklaim lulus semua Android 11
Pengujian dEQP Vulkan.
Nilai 0x07E60301
sesuai dengan tanggal 01-03-2022, yaitu
tanggal yang terkait dengan pengujian dEQP Vulkan untuk
Android 13. Jika penanda fitur
setidaknya memiliki nilai ini,
perangkat mengklaim lulus semua Android 13 Vulkan
Pengujian dEQP.
Perangkat yang mengekspos tombol fitur tertentu (yaitu,
0x07E30301
, 0x07E40301
, 0x07E60301
)
mengklaim lulus semua pengujian dEQP Vulkan Android dari tombol fitur tersebut (Android 10,
Android 11, Android 13). Perangkat ini
dapat lulus pengujian dEQP Vulkan dari rilis Android berikutnya.
Vulkan dEQP merupakan bagian dari Android CTS. Dari Android 11, runner pengujian dEQP
komponen CTS mengetahui android.software.vulkan.deqp.level
tombol fitur, dan melewati semua pengujian dEQP Vulkan yang menurutnya
tombol fitur - perangkat tidak mengklaim mendukung. Pengujian tersebut
dilaporkan sebagai
lewatan sederhana.