Memigrasikan skrip ke Vulkan

Untuk beban kerja yang ideal menggunakan komputasi GPU, memigrasikan skrip RenderScript ke komputasi Vulkan akan memberi aplikasi Anda kontrol yang lebih langsung atas hardware GPU, sehingga berpotensi mendapatkan performa tambahan dibandingkan API lainnya.

Ringkasan tingkat tinggi berikut akan membantu Anda menggunakan shader komputasi Vulkan untuk mengganti skrip RenderScript.

Inisialisasi Vulkan

Daripada membuat objek konteks RenderScript di Kotlin atau Java, lakukan langkah-langkah berikut untuk membuat konteks Vulkan menggunakan NDK.

  1. Buat instance Vulkan.

  2. Pilih perangkat fisik Vulkan yang mendukung antrean komputasi.

  3. Buat perangkat logis Vulkan, dan dapatkan antrean komputasi.

Anda dapat memilih apakah akan menyiapkan lapisan validasi Vulkan di Android untuk mempercepat pengembangan aplikasi Vulkan Anda.

Aplikasi contoh menunjukkan cara melakukan inisialisasi konteks Vulkan di VulkanContext.h. Untuk mempelajari lebih lanjut, lihat bagian Inisialisasi serta Perangkat dan Antrean spesifikasi Vulkan.

Alokasi Vulkan

Alokasi RenderScript dapat dimigrasikan ke gambar penyimpanan Vulkan atau buffer penyimpanan Vulkan. Untuk performa yang lebih baik dengan gambar hanya baca, gunakan gambar sampel dengan operasi pengambilan, baik sebagai kombinasi sampler gambar, atau dengan binding sampler dan gambar sampel yang berbeda.

Resource Vulkan dialokasikan di dalam Vulkan. Untuk menghindari penyalinan memori secara berlebihan saat berinteraksi dengan komponen Android lainnya, sebaiknya gunakan ekstensi VK_ANDROID_external_memory_android_hardware_buffer untuk mengimpor AHardwareBuffer Android ke Vulkan. Ekstensi ini tersedia di semua perangkat Android yang mendukung Vulkan 1.1. Untuk informasi selengkapnya, lihat FEATURE_VULKAN_HARDWARE_VERSION.

Aplikasi contoh menunjukkan cara membuat resource Vulkan di VulkanResources.h. Untuk mempelajari lebih lanjut, lihat bagian pembuatan resource dan deskripsi resource spesifikasi Vulkan.

Konversi ke shader komputasi Vulkan

Skrip RenderScript Anda harus dikonversi ke shader komputasi Vulkan. Anda mungkin juga perlu menyesuaikan kode Anda, bergantung pada penggunaan global RenderScript.

Menulis shader komputasi Vulkan

Shader komputasi Vulkan biasanya ditulis dalam OpenGL Shading Language (GLSL) lalu dikompilasi ke format Standard Portable Intermediate Representation-V (SPIR-V).

Untuk informasi dan petunjuk mendetail tentang cara mengintegrasikan shaders ke dalam aplikasi Anda, lihat compiler shader Vulkan di Android.

Adaptasi global skrip

Berdasarkan karakteristik global skrip, sebaiknya gunakan konstanta spesialisasi, konstanta push, atau objek buffer yang seragam untuk global yang tidak dimodifikasi di dalam shader:

  • Konstanta spesialisasi: Direkomendasikan untuk global skrip yang sebagian besar konsisten di seluruh panggilan kernel. Pengubahan nilai konstanta spesialisasi memerlukan pembuatan ulang pipeline komputasi.
  • Konstanta push: Direkomendasikan untuk global skrip yang sering berubah dengan ukuran yang lebih kecil dari maxPushConstantsSize (minimum yang dijamin: 128 byte).
  • Buffer yang seragam: Direkomendasikan untuk global skrip yang sering berubah dan lebih besar dari batas konstanta push.

Untuk global yang diubah di dalam shader, Anda dapat menggunakan gambar penyimpanan Vulkan atau buffer penyimpanan Vulkan.

Komputasi

Anda harus membuat pipeline komputasi Vulkan agar GPU menjalankan shader komputasi Anda.

Membuat pipeline komputasi Vulkan

File ComputePipeline.h di aplikasi contoh menunjukkan cara membuat pipeline komputasi Vulkan.

Untuk menggunakan shader SPIR-V yang telah dikompilasi di Vulkan, buat pipeline komputasi Vulkan seperti berikut:

  1. Buat modul shader dengan shader SPIR-V yang telah dikompilasi.
  2. Buat tata letak kumpulan deskripsi yang menentukan binding resource (lihat Alokasi untuk detail selengkapnya).
  3. Buat kumpulan deskripsi dari tata letak kumpulan deskripsi.
  4. Buat tata letak pipeline dari tata letak kumpulan deskripsi.
  5. Buat pipeline komputasi dengan modul shader dan tata letak pipeline.

Untuk informasi selengkapnya, lihat bagian Pipeline Komputasi di spesifikasi Vulkan.

Memulai komputasi

Untuk memulai komputasi dengan pipeline komputasi:

  1. Perbarui kumpulan deskripsi dengan resource Vulkan.
  2. Buat buffer perintah Vulkan, dan catat perintah berikut:
    1. Terapkan binding pada pipeline dan kumpulan deskripsi.
    2. Kirimkan grup kerja komputasi.
  3. Kirimkan buffer perintah ke antrean komputasi.
  4. Tunggu antrean, atau jika ingin, tampilkan fence sinkronisasi.

Untuk mengikat beberapa kernel (misalnya, untuk memigrasikan kode menggunakan ScriptGroup), catat kernel di satu buffer perintah dan sinkronkan dengan memory barrier.

Aplikasi contoh menunjukkan dua tugas komputasi:

  • Rotasi HUE: Tugas komputasi sederhana dengan satu shader komputasi. Lihat ImageProcessor::rotateHue untuk contoh kode.
  • Pemburaman: Tugas komputasi yang lebih kompleks yang secara berurutan menjalankan dua shader komputasi. Lihat ImageProcessor::blur untuk contoh kode.

Untuk mempelajari lebih lanjut buffer perintah atau memory batasan, lihat bagian dalam spesifikasi Vulkan yang disebut Buffer Perintah dan Memory Barrier.