RenderScript-Kernelaufruffunktionen und -typen

Übersicht

Mit der Funktion rsForEvery() kann der Stammkernel eines Skripts aufgerufen werden.

Mit den anderen Funktionen werden die Eigenschaften des Aufrufs eines ausgeführten Kernels abgerufen, z. B. Dimensionen und aktuelle Indexe. Diese Funktionen verwenden einen rs_kernel_context als Argument.

Zusammenfassung

Typen
rs_for_each_strategy_t Vorgeschlagener Zellverarbeitungsauftrag
rs_kernel Handle zu einer Kernelfunktion
rs_kernel_context Umgang mit einem Kernelaufrufkontext
rs_script_call_t Informationen zur Zellenwiederholung
Funktionen
rsForEvery Startet einen Kernel
rsForEveryInternal (Interne API) Einen Kernel im aktuellen Skript starten (mit der Slotnummer)
rsForEveryWithOptions Startet einen Kernel mit Optionen
rsGetArray0 Index in der Array0-Dimension für den angegebenen Kernelkontext
rsGetArray1 Index in der Dimension „Array1“ für den angegebenen Kernelkontext
rsGetArray2 Index in der Array2-Dimension für den angegebenen Kernelkontext
rsGetArray3 Index in der Array3-Dimension für den angegebenen Kernelkontext
rsGetDimArray0 Größe der Array0-Dimension für den angegebenen Kernelkontext
rsGetDimArray1 Größe der Array1-Dimension für den angegebenen Kernelkontext
rsGetDimArray2 Größe der Array2-Dimension für den angegebenen Kernelkontext
rsGetDimArray3 Größe der Array3-Dimension für den angegebenen Kernelkontext
RSGetDimHasFaces Vorhandensein von mehr als einem Gesicht für den angegebenen Kernelkontext
rsGetDimLod Anzahl der Detailebenen für den angegebenen Kernelkontext
rsGetDimX Größe der X-Dimension für den angegebenen Kernelkontext
„rsGetDimY“ Größe der Y-Dimension für den angegebenen Kernelkontext
RSGetDimZ Größe der Z-Dimension für den angegebenen Kernel-Kontext
rsGetFace Koordinate des Gesichts für den angegebenen Kernel-Kontext
RSGetLod Index in der Dimension „Detailebenen“ für den angegebenen Kernel-Kontext

Typen

rs_for_each_strategy_t : Vorgeschlagene Zellenverarbeitungsreihenfolge

Ein enum mit den folgenden Werten:     

RS_FOR_EACH_STRATEGY_SERIAL = 0Sie bevorzugen zusammenhängende Speicherregionen.
RS_FOR_EACH_STRATEGY_DONT_CARE = 1Keine Einstellungen.
RS_FOR_EACH_STRATEGY_DST_LINEAR = 2Ich bevorzuge DST.
RS_FOR_EACH_STRATEGY_TILE_small = 3Ich bevorzuge die Verarbeitung kleiner rechteckiger Bereiche.
RS_FOR_EACH_STRATEGY_TILE_MEDIUM = 4Mittlere rechteckige Regionen werden bevorzugt verarbeitet.
RS_FOR_EACH_STRATEGY_TILE_LARGE = 5Ich bevorzuge die Verarbeitung großer rechteckiger Bereiche.

Mit diesem Typ wird vorgeschlagen, wie der aufgerufene Kernel über die Zellen der Zuweisungen iterieren soll. Dies ist nur ein Hinweis. Implementierungen entsprechen möglicherweise nicht dem Vorschlag.

Diese Spezifikation kann das Caching-Verhalten des laufenden Kernels unterstützen, z.B. den Cache-Speicherort, wenn die Verarbeitung auf mehrere Kerne verteilt ist.

rs_kernel : Umgang mit einer Kernelfunktion

Ein typedef von: void*     In API-Level 24 hinzugefügt

Ein intransparenter Typ für eine Funktion, die über das Kernel-Attribut definiert wird. Ein Wert dieses Typs kann in einem rsForEvery-Aufruf verwendet werden, um einen Kernel zu starten.

rs_kernel_context : Umgang mit einem Kernelaufrufkontext

Ein typedef-Typ: const STRUCT rs_kernel_context_t *     Hinzugefügt in API-Ebene 23

Der Kernel-Kontext enthält allgemeine Merkmale der Zuweisungen, über die iteriert wird, z. B. Dimensionen. Außerdem enthält es selten verwendete Indexe der aktuell verarbeiteten Zelle, wie den Array0-Index oder die aktuelle Detailebene.

Um auf den Kernel-Kontext zuzugreifen, fügen Sie Ihrer Kernel-Funktion einen speziellen Parameter namens "context" vom Typ rs_kernel_context hinzu. Beispiele finden Sie unter rsGetDimX() und rsGetArray0().

rs_script_call_t : Informationen zur Zellenwiederholung

Eine Struktur mit den folgenden Feldern:     

rs_for_each_strategy_t-StrategieWird derzeit ignoriert. Zukünftig wird eine Strategie zur Iteration von Zellen vorgeschlagen.
uint32_t xStartStartindex in der Dimension „X“.
uint32_t xEndEndindex (ausschließlich) in der Dimension „X“.
uint32_t yStartStartindex in der Dimension „Y“.
uint32_t yEndEndindex (ausschließlich) in der Dimension „Y“
uint32_t zStartStartindex in der Z-Dimension.
uint32_t zEndeEndindex (ausschließlich) in der Z-Dimension.
uint32_t ArrayStartStartindex in der Dimension Array0.
uint32_t ArrayEndEndindex (ausschließlich) in der Dimension Array0
uint32_t Array1StartStartindex in der Dimension „Array1“.
uint32_t Array1EndeEndindex (ausschließlich) in der Dimension Array1
uint32_t Array2StartStartindex in der Dimension Array2.
uint32_t Array2EndeEndindex (ausschließlich) in der Dimension Array2
uint32_t Array3StartStartindex in der Dimension Array3.
uint32_t Array3EndeEndindex (ausschließlich) in der Dimension Array3

Diese Struktur wird verwendet, um einem rsForEvery-Aufruf Iterationsinformationen bereitzustellen. Es wird derzeit verwendet, um die Verarbeitung auf eine Teilmenge von Zellen zu beschränken. In zukünftigen Versionen wird er auch dazu verwendet, Hinweise für die beste Iteration über die Zellen zu geben.

Die Felder „Start“ sind inklusiv, die Felder „End“ ausschließlich. Um z.B. über die Zellen 4, 5, 6 und 7 in der Dimension X zu iterieren, setzen Sie xStart auf 4 und xEnd auf 8.

Funktionen

rsForEvery : Startet einen Kernel

void rsForAny(rs_kernel-Kernel, ... ...); In API-Level 24 hinzugefügt
void rsForEvery(rs_script-Skript, rs_allocation-Eingabe, rs_allocation-Ausgabe); API-Level 14–23
void rsForEvery(rs_script script, rs_allocation-Eingabe, rs_allocation-Ausgabe, const void* usrData); Aus API-Level 14 und höher entfernt
void rsForEvery(rs_script script, rs_allocation input, rs_allocation-Ausgabe, const void* usrData, const rs_script_call_t* sc); Aus API-Level 14 und höher entfernt
void rsForEvery(rs_script-Skript, rs_allocation-Eingabe, rs_allocation-Ausgabe, const void* usrData, size_t usrDataLen); API-Level 14–20
void rsForEvery(rs_script-Skript, rs_allocation-Eingabe, rs_allocation-Ausgabe, const void* usrData, size_t usrDataLen, const rs_script_call_t* sc); API-Level 14–20
Parameter
SkriptSkript für den Anruf.
EingangZuordnung zu Quelldaten.
outputZuordnung, in die ein Datum geschrieben wird.
usrDataBenutzerdefinierte Daten, die an das Skript übergeben werden sollen. Kann NULL sein.
scZusätzliche Kontrollinformationen, mit denen eine Unterregion der Zuweisung für die Verarbeitung ausgewählt oder eine Fußgängerstrategie vorgeschlagen wird. Kann NULL sein.
usrDataLenGröße der userData-Struktur. Auf diese Weise wird bei Bedarf eine oberflächliche Kopie der Daten erstellt.
KernelFunktionsbezeichner für eine Funktion, die über das Kernel-Attribut definiert wird.
Eingabe- und Ausgabezuweisungen

Führt den Kernel für null oder mehr Eingabezuweisungen aus. Sie werden nach dem Argument rs_kernel übergeben. Wenn der angegebene Kernel einen Wert zurückgibt, muss eine Ausgabezuweisung als letztes Argument angegeben werden. Alle Eingabezuweisungen und ggf. die Ausgabezuordnungen müssen dieselben Dimensionen haben.

Dies ist eine synchrone Funktion. Ein Aufruf dieser Funktion wird erst zurückgegeben, wenn die Arbeit für alle Zellen der Eingabezuweisungen abgeschlossen ist. Wenn die Kernelfunktion einen Wert zurückgibt, wartet der Aufruf, bis alle Ergebnisse in die Ausgabezuweisung geschrieben wurden.

Bis API-Level 23 wird der Kernel im angegebenen Skript implizit als Kernel mit dem Namen "root" angegeben. Es kann nur eine einzige Eingabezuweisung verwendet werden. Ab API-Level 24 kann eine beliebige Kernelfunktion verwendet werden, wie durch das Kernel-Argument angegeben. Das Skriptargument wird entfernt. Der Kernel muss im aktuellen Skript definiert sein. Außerdem kann mehr als eine Eingabe verwendet werden.

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

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

rsForEveryInternal : (Interne API) Einen Kernel im aktuellen Script starten (mit der Slotnummer)

void rsForEveryInternal(int slot, rs_script_call_t* options, int hasOutput, int numInputs, rs_allocation* allocs); In API-Level 24 hinzugefügt
Parameter
Zeitblock
Optionen
hasOutputGibt an, ob der Kernel eine Ausgabe generiert
numInputsAnzahl der Eingabezuweisungen
ZuweisungenEingabe- und Ausgabezuweisungen

Interne API zum Starten eines Kernels.

rsForEveryWithOptions : Startet einen Kernel mit Optionen

void rsForEveryWithOptions(rs_kernel-Kernel, rs_script_call_t*-Optionen, ... ...); In API-Level 24 hinzugefügt
Parameter
KernelFunktionsbezeichner für eine Funktion, die über das Kernel-Attribut definiert wird.
OptionenStartoptionen
Eingabe- und Ausgabezuweisungen

Startet den Kernel auf ähnliche Weise wie rsForEvery. Anstatt jedoch alle Zellen in der Eingabe zu verarbeiten, verarbeitet diese Funktion nur Zellen im Unterraum des in den Optionen angegebenen Indexraums. Wenn der Indexbereich explizit durch Optionen angegeben wird, ist für einen Kernelstart mit dieser API keine Eingabe- oder Ausgabezuweisung erforderlich. Wenn Zuweisungen übergeben werden, müssen sie der Anzahl der Argumente und dem Rückgabewert entsprechen, der von der Kernelfunktion erwartet wird. Die Ausgabezuweisung ist nur dann vorhanden, wenn der Kernel einen nicht ungültigen Rückgabewert hat.

Beispiel:
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 in der Array0-Dimension für den angegebenen Kernelkontext

uint32_t rsGetArray0(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt den Index in der Array0-Dimension der verarbeiteten Zelle zurück, wie im angegebenen Kernelkontext angegeben.

Der Kernel-Kontext enthält allgemeine Merkmale der Zuweisungen, die iteriert werden, und selten verwendete Indexe, wie den Array0-Index.

Sie können auf den Kernel-Kontext zugreifen, indem Sie Ihrer Kernel-Funktion einen speziellen Parameter namens "context" vom Typ "rs_kernel_context" hinzufügen. Beispiel:
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);
  //...
}

Diese Funktion gibt 0 zurück, wenn die Dimension Array0 nicht vorhanden ist.

rsGetArray1 : Index in der Dimension „Array1“ für den angegebenen Kernelkontext

uint32_t rsGetArray1(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt den Index in der Dimension Array1 der verarbeiteten Zelle zurück, wie im angegebenen Kernelkontext angegeben. Eine Erklärung des Kontexts finden Sie unter rsGetArray0().

Gibt 0 zurück, wenn die Dimension Array1 nicht vorhanden ist.

rsGetArray2 : Index in der Array2-Dimension für den angegebenen Kernel-Kontext

uint32_t rsGetArray2(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt den Index in der Array2-Dimension der verarbeiteten Zelle zurück, wie im angegebenen Kernelkontext angegeben. Eine Erläuterung des Kontexts finden Sie unter rsGetArray0().

Gibt 0 zurück, wenn die Dimension Array2 nicht vorhanden ist.

rsGetArray3 : Index in der Array3-Dimension für den angegebenen Kernelkontext

uint32_t rsGetArray3(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt den Index in der Array3-Dimension der verarbeiteten Zelle zurück, wie im angegebenen Kernelkontext angegeben. Eine Erklärung des Kontexts finden Sie unter rsGetArray0().

Gibt 0 zurück, wenn die Dimension Array3 nicht vorhanden ist.

rsGetDimArray0 : Größe der Array0-Dimension für den angegebenen Kernelkontext

uint32_t rsGetDimArray0(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt die Größe der Array0-Dimension für den angegebenen Kernel-Kontext zurück. Eine Erklärung des Kontexts finden Sie unter rsGetDimX().

Gibt 0 zurück, wenn die Dimension Array0 nicht vorhanden ist.

rsGetDimArray1 : Größe der Dimension „Array1“ für den angegebenen Kernelkontext

uint32_t rsGetDimArray1(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt die Größe der Array1-Dimension für den angegebenen Kernelkontext zurück. Eine Erklärung des Kontexts finden Sie unter rsGetDimX().

Gibt 0 zurück, wenn die Dimension Array1 nicht vorhanden ist.

rsGetDimArray2 : Größe der Array2-Dimension für den angegebenen Kernelkontext

uint32_t rsGetDimArray2(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt die Größe der Array2-Dimension für den angegebenen Kernelkontext zurück. Eine Erklärung des Kontexts finden Sie unter rsGetDimX().

Gibt 0 zurück, wenn die Dimension Array2 nicht vorhanden ist.

rsGetDimArray3 : Größe der Array3-Dimension für den angegebenen Kernelkontext

uint32_t rsGetDimArray3(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt die Größe der Array3-Dimension für den angegebenen Kernelkontext zurück. Eine Erklärung des Kontexts finden Sie unter rsGetDimX().

Gibt 0 zurück, wenn die Dimension Array3 nicht vorhanden ist.

rsGetDimHasFaces : Vorhandensein von mehr als einem Gesicht für den angegebenen Kernelkontext

bool rsGetDimHasFaces(rs_kernel_context context); In API-Level 23 hinzugefügt
Returns
Gibt „true“ zurück, wenn mehr als ein Gesicht vorhanden ist, andernfalls „false“.

Wenn der Kernel über eine Cubemap iteriert, gibt diese Funktion „true“ zurück, wenn mehr als ein Gesicht vorhanden ist. In allen anderen Fällen wird „false“ zurückgegeben. Eine Erläuterung des Kontexts finden Sie unter rsGetDimX().

rsAllocationGetDimFaces() ist ähnlich, gibt aber „0“ oder „1“ anstelle eines booleschen Werts zurück.

rsGetDimLod: Anzahl der Detailebenen für den angegebenen Kernelkontext

uint32_t rsGetDimLod(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt die Anzahl der Detailebenen für den angegebenen Kernel-Kontext zurück. Dies ist nützlich für Mipmaps. Eine Erklärung des Kontexts finden Sie unter rsGetDimX().

Gibt 0 zurück, wenn keine Detailebene verwendet wird.

rsAllocationGetDimLOD() ist ähnlich, gibt aber anstelle der tatsächlichen Anzahl der Ebenen 0 oder 1 zurück.

rsGetDimX : Größe der X-Dimension für den angegebenen Kernel-Kontext

uint32_t rsGetDimX(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt die Größe der X-Dimension für den angegebenen Kernel-Kontext zurück.

Der Kernel-Kontext enthält allgemeine Merkmale der Zuweisungen, die iteriert werden, und selten verwendete Indexe, wie den Array0-Index.

Sie können darauf zugreifen, indem Sie Ihrer Kernelfunktion einen speziellen Parameter namens „context“ vom Typ „rs_kernel_context“ hinzufügen. Beispiel:
int4 RS_KERNEL myKernel(int4 value, rs_kernel_context context) {
  uint32_t size = rsGetDimX(context); //...

Mit rsAllocationGetDimX() können Sie die Dimension einer bestimmten Zuweisung abrufen.

rsGetDimY : Größe der Y-Dimension für den angegebenen Kernel-Kontext

uint32_t rsGetDimY(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt die Größe der X-Dimension für den angegebenen Kernel-Kontext zurück. Eine Erklärung des Kontexts finden Sie unter rsGetDimX().

Gibt 0 zurück, wenn die Dimension Y nicht vorhanden ist.

Mit rsAllocationGetDimY() können Sie die Dimension einer bestimmten Zuweisung abrufen.

rsGetDimZ : Größe der Z-Dimension für den angegebenen Kernel-Kontext

uint32_t rsGetDimZ(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt die Größe der Z-Dimension für den angegebenen Kernelkontext zurück. Eine Erklärung des Kontexts finden Sie unter rsGetDimX().

Gibt 0 zurück, wenn die Z-Dimension nicht vorhanden ist.

Die Dimension einer bestimmten Zuweisung rufen Sie mit rsAllocationGetDimZ() ab.

rsGetFace : Koordinate des Gesichts für den angegebenen Kernelkontext

rs_allocation_cubemap_face rsGetFace(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt das Gesicht zurück, auf dem die verarbeitete Zelle gefunden wurde, wie im angegebenen Kernelkontext angegeben. Eine Erklärung des Kontexts finden Sie unter rsGetArray0().

Gibt RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X zurück, wenn die Dimension "Gesicht" nicht vorhanden ist.

rsGetLod : Index in der Dimension „Detailebenen“ für den angegebenen Kernelkontext

uint32_t rsGetLod(rs_kernel_context context); In API-Level 23 hinzugefügt

Gibt den Index in der Dimension „Detailebenen“ der verarbeiteten Zelle zurück, wie im angegebenen Kernelkontext angegeben. Eine Erklärung des Kontexts finden Sie unter rsGetArray0().

Gibt 0 zurück, wenn die Dimension „Detailebenen“ nicht vorhanden ist.