Fonctions et types d'appel du noyau RenderScript

Présentation

La fonction rsForEvery() peut être utilisée pour appeler le noyau racine d'un script.

Les autres fonctions permettent d'obtenir les caractéristiques de l'appel d'un noyau en cours d'exécution, telles que les dimensions et les index actuels. Ces fonctions utilisent rs_kernel_context comme argument.

Résumé

Types
rs_for_each_strategy_t Ordre suggéré pour le traitement des cellules
rs_kernel Gérer une fonction de noyau
rs_kernel_context Gérer un contexte d'appel du noyau
rs_script_call_t Informations sur l'itération des cellules
Fonctions
rsForChaque Lance un noyau
rsForEveryInternal (API interne) Lancer un noyau dans le script actuel (avec le numéro d'emplacement)
rsForEveryWithOptions Lance un noyau avec des options
rsGetArray0 Index dans la dimension Array0 pour le contexte de noyau spécifié
rsGetArray1 Index dans la dimension Array1 pour le contexte de noyau spécifié
rsGetArray2 Index dans la dimension Array2 pour le contexte de noyau spécifié
rsGetArray3 Index dans la dimension Array3 pour le contexte de noyau spécifié
rsGetDimArray0 Taille de la dimension Array0 pour le contexte de noyau spécifié
rsGetDimArray1 Taille de la dimension Array1 pour le contexte de noyau spécifié
rsGetDimArray2 Taille de la dimension Array2 pour le contexte de noyau spécifié
rsGetDimArray3 Taille de la dimension Array3 pour le contexte de noyau spécifié
rsGetDimHasFaces Présence de plusieurs visages pour le contexte de noyau spécifié
rsGetDimLod Nombre de niveaux de détail pour le contexte de noyau spécifié
rsGetDimX Taille de la dimension X pour le contexte de noyau spécifié
RSGetDimY Taille de la dimension Y pour le contexte de noyau spécifié
rsGetDimZ Taille de la dimension Z pour le contexte de noyau spécifié
rsGetFace Coordonnées du visage pour le contexte du noyau spécifié
rsGetLod Index dans la dimension Niveaux de détail pour le contexte de noyau spécifié

Types

rs_for_each_strategy_t : suggestion d'ordre de traitement sur le réseau mobile

Énumération avec les valeurs suivantes:     

RS_FOR_EACH_STRATEGY_SERIAL = 0Choisissez des régions de mémoire contiguës.
RS_FOR_EACH_STRATEGY_DONT_CARE = 1Aucune préférence.
RS_FOR_EACH_STRATEGY_DST_LINEAR = 2Je préfère l'heure d'été.
RS_FOR_EACH_STRATEGY_TILE_Small = 3Privilégiez le traitement de petites régions rectangulaires.
RS_FOR_EACH_STRATEGY_TILE_MEDIUM = 4Privilégier les régions rectangulaires moyennes.
RS_FOR_EACH_STRATEGY_TILE_LARGE = 5Privilégiez le traitement sur de grandes régions rectangulaires.

Ce type est utilisé pour suggérer la manière dont le noyau appelé doit itérer sur les cellules des allocations. Ceci n'est qu'un indice. Les implémentations peuvent ne pas suivre la suggestion.

Cette spécification peut faciliter le comportement de mise en cache du noyau en cours d'exécution, par exemple la localité du cache lorsque le traitement est réparti sur plusieurs cœurs.

rs_kernel : gestion d'une fonction de noyau

Définition de type: void*     Attribut ajouté au niveau d'API 24.

Type opaque pour une fonction définie avec l'attribut de noyau. Une valeur de ce type peut être utilisée dans un appel rsForEvery pour lancer un noyau.

rs_kernel_context : gestion d'un contexte d'appel du noyau

Définition de type: const struct rs_kernel_context_t *     Attribut ajouté au niveau d'API 23.

Le contexte du noyau contient des caractéristiques communes aux allocations itérées, telles que les dimensions. Il contient également des index rarement utilisés de la cellule en cours de traitement, comme l'indice Array0 ou le niveau de détail actuel.

Vous pouvez accéder au contexte du noyau en ajoutant un paramètre spécial nommé "context" de type rs_kernel_context à votre fonction de noyau. Consultez rsGetDimX() et rsGetArray0() pour obtenir des exemples.

rs_script_call_t : informations sur l'itération des cellules

Une structure comportant les champs suivants:     

Stratégie rs_for_each_strategy_tActuellement ignoré. À l'avenir, nous suggérerons la stratégie d'itération de cellules.
uint32_t xStartIndex de départ dans la dimension X
uint32_t xEndIndex de fin (exclusif) dans la dimension X
uint32_t yStartIndex de départ dans la dimension Y.
uint32_t yEndIndex de fin (exclusif) dans la dimension Y
uint32_t zStartIndex de départ dans la dimension Z.
uint32_t zEndIndex de fin (exclusif) dans la dimension Z.
uint32_t arrayStartIndex de départ dans la dimension "Tableau"
uint32_t arrayEndIndex de fin (exclusif) dans la dimension "Array0" (Tableau0).
uint32_t array1StartIndex de départ dans la dimension "Tableau"
uint32_t tableau1FinIndex de fin (exclusif) dans la dimension "Tableau1".
uint32_t array2StartIndex de départ dans la dimension "Tableau2".
uint32_t tableau2FinIndex de fin (exclusif) dans la dimension "Tableau2".
uint32_t array3StartIndex de départ dans la dimension "Tableau"
uint32_t tableau3FinIndex de fin (exclusif) dans la dimension "Array3" (Tableau3).

Cette structure est utilisée pour fournir des informations d'itération à un appel rsForEvery. Il est actuellement utilisé pour restreindre le traitement à un sous-ensemble de cellules. Dans les futures versions, elle servira également à fournir des indications sur la meilleure façon d'itérer les cellules.

Les champs Début sont inclus et les champs Fin sont exclusifs. Par exemple, pour itérer sur les cellules 4, 5, 6 et 7 de la dimension X, définissez xStart sur 4 et xEnd sur 8.

Fonctions

rsForEvery : lance un noyau

void rsForEvery(rs_kernel kernel, ... ...); Ajouté au niveau d'API 24
void rsForEvery(script rs_script, entrée rs_allocation, sortie rs_allocation); Niveau d'API 14 à 23
void rsForEvery(script rs_script, entrée rs_allocation, sortie rs_allocation, const void* usrData); Supprimé du niveau d'API 14 ou supérieur
void rsForEvery(script rs_script, entrée rs_allocation, sortie rs_allocation, const void* usrData, const rs_script_call_t* sc); Supprimé du niveau d'API 14 ou supérieur
void rsForeach(script rs_script, entrée rs_allocation, sortie rs_allocation, const void* usrData, size_t usrDataLen); Niveau d'API 14 à 20
void rsForEvery(script rs_script, entrée rs_allocation, sortie rs_allocation, const void* usrData, size_t usrDataLen, const rs_script_call_t* sc); Niveau d'API 14 à 20
Paramètres
scriptScript à appeler.
entréeAllocation à partir de laquelle les données sources sont utilisées.
outputAllocation dans laquelle écrire la date.
usrDataDonnées définies par l'utilisateur à transmettre au script. Peut être NULL.
scInformations de contrôle supplémentaires permettant de sélectionner une sous-région de l'allocation à traiter ou de suggérer une stratégie de marche. Peut être NULL.
usrDataLenTaille de la structure userData. Ceci sera utilisé pour effectuer une copie superficielle des données si nécessaire.
noyaude la fonction à une fonction définie avec l'attribut du noyau.
...Allocations d'entrée et de sortie

Exécute le noyau sur zéro ou plusieurs allocations d'entrées. Elles sont transmises après l'argument rs_kernel. Si le noyau spécifié renvoie une valeur, une allocation de sortie doit être spécifiée en tant que dernier argument. Toutes les allocations d'entrée et l'allocation en sortie, le cas échéant, doivent avoir les mêmes dimensions.

Il s'agit d'une fonction synchrone. Un appel à cette fonction n'est renvoyé qu'une fois que tout le travail est terminé pour toutes les cellules des allocations d'entrée. Si la fonction du noyau renvoie une valeur, l'appel attend que tous les résultats aient été écrits dans l'allocation de sortie.

Jusqu'au niveau d'API 23, le noyau est implicitement spécifié en tant que noyau nommé "root" dans le script spécifié, et une seule allocation d'entrée peut être utilisée. À partir du niveau d'API 24, une fonction de noyau arbitraire peut être utilisée, comme spécifié par l'argument du noyau. L'argument de script est supprimé. Le noyau doit être défini dans le script actuel. En outre, plusieurs entrées peuvent être utilisées.

Exemple :
float __attribute__((kernel)) square(float a) {
  return a * a;
}

void compute(rs_allocation ain, rs_allocation aout) {
  rsForEach(square, ain, aout);
}

rsForEveryInternal (API interne) : lance un noyau dans le script actuel (avec le numéro d'emplacement)

void rsForeachInternal(int_slot, rs_script_call_t* options, int hasOutput, int numInputs, rs_allocation* allocs); Ajouté au niveau d'API 24
Paramètres
créneau
options
hasOutputIndique si le noyau génère une sortie
Nombre d'entréesNombre d'allocations d'entrées
allocationsAllocations d'entrée et de sortie

API interne permettant de lancer un noyau.

rsForEveryWithOptions : lance un noyau avec des options

void rsForEveryWithOptions(rs_kernel kernel, rs_script_call_t* options, ... ...); Ajouté au niveau d'API 24
Paramètres
noyaude la fonction à une fonction définie avec l'attribut du noyau.
optionsOptions de lancement
...Allocations d'entrée et de sortie

Lance le noyau d'une manière semblable à rsForEvery. Toutefois, au lieu de traiter toutes les cellules de l'entrée, cette fonction ne traite que les cellules situées dans le sous-espace de l'espace d'index spécifié dans les options. L'espace d'index étant explicitement spécifié par les options, aucune allocation d'entrée ou de sortie n'est requise pour le lancement d'un noyau à l'aide de cette API. Si des allocations sont transmises, elles doivent correspondre au nombre d'arguments et à la valeur de retour attendus par la fonction de noyau. L'allocation en sortie n'est présente que si et seulement si le noyau possède une valeur renvoyée non nulle.

Exemple :
rs_script_call_t opts = {0};
opts.xStart = 0;
opts.xEnd = dimX;
opts.yStart = 0;
opts.yEnd = dimY / 2;
rsForEachWithOptions(foo, &opts, out, out);

rsGetArray0 : index dans la dimension Array0 pour le contexte de noyau spécifié

uint32_t rsGetArray0(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie l'index dans la dimension Array0 de la cellule en cours de traitement, comme spécifié par le contexte de noyau fourni.

Le contexte du noyau contient les caractéristiques communes des allocations itérées et des index rarement utilisés, tels que l'index Array0.

Vous pouvez accéder au contexte du noyau en ajoutant un paramètre spécial nommé "context" de type rs_kernel_context à votre fonction de noyau. Exemple :
short RS_KERNEL myKernel(short value, uint32_t x, rs_kernel_context context) {
  // The current index in the common x, y, z dimensions are accessed by
  // adding these variables as arguments. For the more rarely used indices
  // to the other dimensions, extract them from the kernel context:
  uint32_t index_a0 = rsGetArray0(context);
  //...
}

Cette fonction renvoie 0 si la dimension "Array0" n'est pas présente.

rsGetArray1 : index dans la dimension Array1 pour le contexte de noyau spécifié

uint32_t rsGetArray1(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie l'index dans la dimension Array1 de la cellule en cours de traitement, comme spécifié par le contexte de noyau fourni. Consultez rsGetArray0() pour obtenir une explication du contexte.

Renvoie 0 si la dimension "Array1" n'est pas présente.

rsGetArray2 : index dans la dimension "Array2" pour le contexte de noyau spécifié

uint32_t rsGetArray2(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie l'index dans la dimension Array2 de la cellule en cours de traitement, comme spécifié par le contexte de noyau fourni. Consultez rsGetArray0() pour obtenir une explication du contexte.

Renvoie 0 si la dimension "Array2" n'est pas présente.

rsGetArray3 : index dans la dimension "Array3" pour le contexte de noyau spécifié

uint32_t rsGetArray3(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie l'index dans la dimension Array3 de la cellule en cours de traitement, comme spécifié par le contexte de noyau fourni. Consultez rsGetArray0() pour obtenir une explication du contexte.

Renvoie 0 si la dimension "Array3" n'est pas présente.

rsGetDimArray0 : taille de la dimension "Array0" pour le contexte de noyau spécifié

uint32_t rsGetDimArray0(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie la taille de la dimension Array0 pour le contexte de noyau spécifié. Consultez rsGetDimX() pour obtenir une explication du contexte.

Renvoie 0 si la dimension "Array0" n'est pas présente.

rsGetDimArray1 : taille de la dimension "Array1" pour le contexte de noyau spécifié

uint32_t rsGetDimArray1(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie la taille de la dimension Array1 pour le contexte de noyau spécifié. Consultez rsGetDimX() pour obtenir une explication du contexte.

Renvoie 0 si la dimension "Array1" n'est pas présente.

rsGetDimArray2 : taille de la dimension "Array2" pour le contexte de noyau spécifié

uint32_t rsGetDimArray2(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie la taille de la dimension Array2 pour le contexte de noyau spécifié. Consultez rsGetDimX() pour obtenir une explication du contexte.

Renvoie 0 si la dimension "Array2" n'est pas présente.

rsGetDimArray3 : taille de la dimension "Array3" pour le contexte de noyau spécifié

uint32_t rsGetDimArray3(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie la taille de la dimension Array3 pour le contexte de noyau spécifié. Consultez rsGetDimX() pour obtenir une explication du contexte.

Renvoie 0 si la dimension "Array3" n'est pas présente.

rsGetDimHasFaces : présence de plusieurs visages pour le contexte de noyau spécifié

bool rsGetDimHasFaces(context rs_kernel_context); Ajouté au niveau d'API 23
Renvoie
Renvoie la valeur "true" si plusieurs visages sont présents et la valeur "false" dans le cas contraire.

Si le noyau effectue une itération sur un plan cube, cette fonction renvoie la valeur "true" si plusieurs faces sont présentes. Dans tous les autres cas, la valeur renvoyée est "false". Consultez rsGetDimX() pour obtenir une explication du contexte.

rsAllocationGetDimFaces() est similaire, mais renvoie 0 ou 1 au lieu d'une valeur booléenne.

rsGetDimLod : nombre de niveaux de détail pour le contexte de noyau spécifié

uint32_t rsGetDimLod(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie le nombre de niveaux de détail pour le contexte de noyau spécifié. C'est utile pour les mipmaps. Consultez rsGetDimX() pour obtenir une explication du contexte.

Renvoie 0 si le niveau de détail n'est pas utilisé.

rsAllocationGetDimLOD() est similaire, mais renvoie 0 ou 1 au lieu du nombre réel de niveaux.

rsGetDimX : taille de la dimension X pour le contexte de noyau spécifié

uint32_t rsGetDimX(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie la taille de la dimension X pour le contexte de noyau spécifié.

Le contexte du noyau contient les caractéristiques communes des allocations itérées et des index rarement utilisés, tels que l'index Array0.

Vous pouvez y accéder en ajoutant un paramètre spécial nommé "context" de type rs_kernel_context à votre fonction de noyau. Exemple :
int4 RS_KERNEL myKernel(int4 value, rs_kernel_context context) {
  uint32_t size = rsGetDimX(context); //...

Pour obtenir la dimension d'allocation spécifique, utilisez rsAllocationGetDimX().

rsGetDimY : taille de la dimension Y pour le contexte de noyau spécifié

uint32_t rsGetDimY(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie la taille de la dimension X pour le contexte de noyau spécifié. Consultez rsGetDimX() pour obtenir une explication du contexte.

Renvoie 0 si la dimension Y n'est pas présente.

Pour obtenir la dimension d'allocation spécifique, utilisez rsAllocationGetDimY().

rsGetDimZ : taille de la dimension Z pour le contexte de noyau spécifié

uint32_t rsGetDimZ(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie la taille de la dimension Z pour le contexte de noyau spécifié. Consultez rsGetDimX() pour obtenir une explication du contexte.

Renvoie 0 si la dimension Z n'est pas présente.

Pour obtenir la dimension d'allocation spécifique, utilisez rsAllocationGetDimZ().

rsGetFace : coordonnée du visage pour le contexte du noyau spécifié

Renvoie la face sur laquelle la cellule en cours de traitement est trouvée, comme spécifié par le contexte de noyau fourni. Consultez rsGetArray0() pour obtenir une explication du contexte.

Renvoie RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X si la dimension du visage n'est pas présente.

rsGetLod : indice dans la dimension "Niveaux de détail" pour le contexte de noyau spécifié

uint32_t rsGetLod(contexte rs_kernel_context); Ajouté au niveau d'API 23

Renvoie l'index dans la dimension "Niveaux de détail" de la cellule en cours de traitement, comme spécifié par le contexte de noyau fourni. Consultez rsGetArray0() pour obtenir une explication du contexte.

Renvoie 0 si la dimension Niveaux de détail n'est pas présente.