Esegui la migrazione degli script a Vulkan

Per i carichi di lavoro in cui l'elaborazione GPU è ideale, la migrazione degli script RenderScript al computing Vulkan offre alla tua app un controllo più diretto sull'hardware della GPU, sbloccando potenzialmente prestazioni aggiuntive rispetto ad altre API.

Segue una panoramica generale per aiutarti a utilizzare gli Shader di calcolo Vulkan per sostituire gli script RenderScript.

Inizializzazione Vulkan

Anziché creare un oggetto di contesto RenderScript in Kotlin o Java, segui questi passaggi per creare un contesto Vulkan utilizzando NDK.

  1. Crea un'istanza Vulkan.

  2. Scegli un dispositivo fisico Vulkan che supporti una coda di calcolo.

  3. Crea un dispositivo logico Vulkan e recupera la coda di calcolo.

Se vuoi, puoi impostare i livelli di convalida Vulkan su Android per velocizzare lo sviluppo delle tue applicazioni Vulkan.

L'app di esempio mostra come inizializzare il contesto Vulkan in VulkanContext.h. Per saperne di più, consulta le sezioni Inizializzazione e Dispositivi e code della specifica Vulkan.

Allocazioni Vulkan

È possibile eseguire la migrazione di un'allocazione RenderScript a un'immagine di archiviazione Vulkan o a un buffer di archiviazione Vulkan. Per migliorare le prestazioni con le immagini di sola lettura, utilizza un'immagine campionata con operazioni di recupero, come campionatore combinato di immagini o con associazioni di campionatori e immagini campionate distinte.

Le risorse Vulkan sono allocate all'interno di Vulkan. Per evitare overhead di copia della memoria durante l'interazione con altri componenti Android, valuta la possibilità di utilizzare l'estensione VK_ANDROID_external_memory_android_hardware_buffer per importare un Android AHardwareBuffer in Vulkan. Questa estensione è disponibile su tutti i dispositivi Android che supportano Vulkan 1.1. Per saperne di più, visita FEATURE_VULKAN_HARDWARE_VERSION.

L'app di esempio mostra come creare risorse Vulkan in VulkanResources.h. Per saperne di più, consulta le sezioni sulla creazione delle risorse e sui descrittori delle risorse della specifica Vulkan.

Conversione in mesh di computing Vulkan

Gli script RenderScript devono essere convertiti in mesh di computing Vulkan. Potrebbe anche essere necessario adattare il codice a seconda dell'utilizzo di RenderScript globali.

Scrivi uno Shader di computing Vulkan

Un Compute Shadingr Vulkan è comunemente scritto in OpenGL Shading Language (GLSL) e quindi compilato nel formato Standard Portable Intermediate Representation-V (SPIR-V).

Per informazioni dettagliate e istruzioni su come integrare gli mesh nella tua app, consulta la pagina relativa ai compilatori di Vulkan Shader su Android.

Adattamento degli script globali

In base alle caratteristiche degli script globali, consigliamo di utilizzare le costanti di specializzazione, le costanti push o gli oggetti buffer uniformi per le globali che non vengono modificate all'interno dello mesh:

  • Costanti di specializzazione: consigliate per gli script globali che sono per lo più coerenti nelle chiamate del kernel. Se modifichi il valore delle costanti di specializzazione, sarà necessario ricreare la pipeline di calcolo.
  • Esegui il push di costanti: consigliato per elementi globali di script modificati di frequente di dimensioni inferiori a maxPushConstantsSize (minimo garantito: 128 byte).
  • Buffer uniforme: consigliato per elementi globali di script modificati di frequente di dimensioni superiori al limite della costante push.

Per le globali che vengono modificate all'interno dello mesh, puoi utilizzare l'immagine di archiviazione Vulkan o il buffer di archiviazione Vulkan.

Calcolo

Devi creare una pipeline di calcolo Vulkan per consentire alla GPU di eseguire il tuo meshr di calcolo.

Crea una pipeline di calcolo Vulkan

Il file ComputePipeline.h nell'app di esempio mostra come creare la pipeline di calcolo Vulkan.

Per utilizzare uno shardr SPIR-V compilato in Vulkan, costruisci una pipeline di calcolo Vulkan come segue:

  1. Crea un moduloshar con lo shardr SPIR-V compilato.
  2. Crea un layout per set di descrittori che specifichi le associazioni di risorse (consulta Allocazioni per ulteriori dettagli).
  3. Crea un set di descrittori dal layout del set di descrittori.
  4. Crea un layout della pipeline dal layout del set di descrittori.
  5. Crea una pipeline di computing con il modulo mesh e il layout della pipeline.

Per ulteriori informazioni, consulta la sezione pipeline di computing nella specifica Vulkan.

Avvia un calcolo

Per iniziare il calcolo con una pipeline di computing:

  1. Aggiorna il set di descrittori con le risorse Vulkan.
  2. Crea un buffer dei comandi Vulkan e registra i seguenti comandi:
    1. Associa la pipeline e il set di descrittori.
    2. Invia gruppi di lavoro di computing.
  3. Invia il buffer dei comandi alla coda di calcolo.
  4. Attendi in coda o, se vuoi, restituisci un blocco di sincronizzazione.

Per concatenare più kernel (ad esempio per eseguire la migrazione di codici utilizzando ScriptGroup), registrali in un unico buffer di comando e sincronizzali con le barriere di memoria.

L'app di esempio mostra due attività di computing:

  • Rotazione HUE: una semplice attività di computing con un singolo mesh di dati. Vedi ImageProcessor::rotateHue per l'esempio di codice.
  • Sfocatura: un'attività di calcolo più complessa che esegue in sequenza due Shader di calcolo. Visita la pagina ImageProcessor::blur per l'esempio di codice.

Per scoprire di più sui buffer dei comandi o sulle barriere di memoria, consulta le sezioni della specifica Vulkan chiamate buffer dei comandi e barriere di memoria.