Mengimplementasikan Vulkan

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:

  1. 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.
  2. Untuk Vulkan 1.3 atau 1.1, Pastikan fitur sistem yang ditampilkan oleh pengelola paket menampilkan true untuk versi vulkan yang benar.
    • Untuk Vulkan 1.3, fiturnya PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x403000).
    • Untuk Vulkan 1.1, fiturnya PackageManager#hasSystemFeature(PackageManager.FEATURE_VULKAN_HARDWARE_VERSION, 0x401000).
    Pengelola paket akan menampilkan true untuk Vulkan 1.3 dan Vulkan 1.1 dengan menambahkan aturan, yang ditampilkan sebagai berikut, ke file device.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
      
    • 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 10
  • VK_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.