Migrer des scripts vers Vulkan

Pour les charges de travail pour lesquelles le calcul GPU est idéal, la migration des scripts RenderScript vers le calcul Vulkan donne à votre application un contrôle plus direct sur le matériel GPU, ce qui peut potentiellement offrir des performances supérieures à celles d'autres API.

Vous trouverez ci-dessous une présentation générale qui vous aidera à utiliser les nuanceurs de calcul Vulkan pour remplacer les scripts RenderScript.

Initialisation Vulkan

Au lieu de créer un objet de contexte RenderScript en Kotlin ou en Java, procédez comme suit pour créer un contexte Vulkan avec le NDK.

  1. Créez une instance Vulkan.

  2. Choisissez un appareil physique Vulkan compatible avec une file d'attente de calcul.

  3. Créez un appareil logique Vulkan et obtenez la file d'attente de calcul.

Vous pouvez également configurer les couches de validation Vulkan sur Android pour accélérer le développement de votre application Vulkan.

L'application exemple montre comment initialiser le contexte Vulkan dans VulkanContext.h. Pour en savoir plus, consultez les sections Initialisation et Appareils et files d'attente de la spécification Vulkan.

Allocations Vulkan

Une allocation RenderScript peut être migrée vers une image de stockage Vulkan ou un tampon de stockage Vulkan. Pour améliorer les performances des images en lecture seule, utilisez une image échantillonnée avec des opérations d'extraction, soit en tant qu'échantillonneur d'image combiné, soit avec des liaisons d'échantillonneur et d'image échantillonnée.

Les ressources Vulkan sont allouées dans Vulkan. Pour éviter les frais de copie de mémoire lors de l'interaction avec d'autres composants Android, envisagez d'utiliser l'extension VK_ANDROID_external_memory_android_hardware_buffer pour importer un AHardwareBuffer Android dans Vulkan. Cette extension est disponible sur tous les appareils Android compatibles avec Vulkan 1.1. Pour en savoir plus, consultez FEATURE_VULKAN_HARDWARE_VERSION.

L'application exemple montre comment créer des ressources Vulkan dans VulkanResources.h. Pour en savoir plus, consultez les sections sur la création des ressources et les descripteurs de ressources de la spécification Vulkan.

Conversion vers les nuanceurs de calcul Vulkan

Vos scripts RenderScript doivent être convertis en nuanceurs de calcul Vulkan. Vous devrez peut-être également adapter votre code en fonction des éléments généraux de script RenderScript.

Écrire un nuanceur de calcul Vulkan

Un nuanceur de calcul Vulkan est généralement écrit en OpenGL Shading Language (GLSL) puis compilé au format Standard Portable Intermediate Representation-V (SPIR-V).

Pour obtenir des informations et des instructions détaillées sur l'intégration de nuanceurs dans votre application, consultez la page Compilateurs de nuanceurs Vulkan sur Android.

Adaptation d'éléments généraux de script

En fonction des caractéristiques des éléments généraux de script, nous vous recommandons d'utiliser des constantes de spécialisation, des constantes Push ou des objets Uniform Buffer pour les éléments généraux qui ne sont pas modifiées dans le nuanceur :

  • Constantes de spécialisation : recommandées pour les éléments généraux de script généralement cohérents entre les différents appels de noyau. Si vous modifiez la valeur des constantes de spécialisation, vous devrez recréer le pipeline de calcul.
  • Constantes Push : recommandées pour les éléments généraux de script fréquemment modifiés, de taille inférieure à maxPushConstantsSize (minimum garanti: 128 octets).
  • Tampon uniforme : recommandé pour les éléments généraux de script fréquemment modifiés, de taille supérieure à la limite des constantes Push.

Pour les éléments généraux modifiés dans le nuanceur, vous pouvez utiliser l'image de stockage Vulkan ou le tampon de stockage Vulkan.

Calculs

Vous devez créer un pipeline de calcul Vulkan pour que le GPU exécute votre nuanceur de calcul.

Créer un pipeline de calcul Vulkan

Le fichier ComputePipeline.h de l'application exemple montre comment créer le pipeline de calcul Vulkan.

Pour utiliser un nuanceur SPIR-V compilé dans Vulkan, créez un pipeline de calcul Vulkan comme suit :

  1. Créez un module de nuanceur avec le nuanceur SPIR-V compilé.
  2. Créez une mise en page de l'ensemble de descripteurs en spécifiant les liaisons de ressources (consultez la section Allocations pour en savoir plus).
  3. Créez un ensemble de descripteurs à partir de la mise en page de l'ensemble de descripteurs.
  4. Créez une mise en page de pipeline à partir de la mise en page de l'ensemble de descripteurs.
  5. Créez un pipeline de calcul avec le module de nuanceur et la mise en page du pipeline.

Pour en savoir plus, consultez la section Pipelines de calcul de la spécification Vulkan.

Démarrer un calcul

Pour démarrer le calcul avec un pipeline de calcul :

  1. Mettez à jour l'ensemble de descripteurs avec les ressources Vulkan.
  2. Créez un tampon de commande Vulkan et enregistrez les commandes suivantes :
    1. Liez le pipeline à l'ensemble de descripteurs.
    2. Distribuez les groupes de travail de calcul.
  3. Envoyez le tampon de commande à la file d'attente de calcul.
  4. Patientez dans la file d'attente ou renvoyez éventuellement une barrière de synchronisation.

Pour enchaîner plusieurs noyaux (par exemple, pour migrer des codes à l'aide de ScriptGroup), enregistrez-les dans un seul tampon de commande et synchronisez-les avec des barrières de mémoire.

L'application exemple présente deux tâches de calcul:

  • Rotation HUE : tâche de calcul simple avec un seul nuanceur de calcul. Consultez ImageProcessor::rotateHue pour obtenir l'exemple de code.
  • Floutage : tâche de calcul plus complexe qui exécute de manière séquentielle deux nuanceurs de calcul. Consultez ImageProcessor::blur pour obtenir l'exemple de code.

Pour en savoir plus sur les tampons de commande ou les barrières de mémoire, consultez les sections de la spécification Vulkan intitulées Tampons de commande et Barrières de mémoire.