Ü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 = 0 | Sie bevorzugen zusammenhängende Speicherregionen. |
---|---|
RS_FOR_EACH_STRATEGY_DONT_CARE = 1 | Keine Einstellungen. |
RS_FOR_EACH_STRATEGY_DST_LINEAR = 2 | Ich bevorzuge DST. |
RS_FOR_EACH_STRATEGY_TILE_small = 3 | Ich bevorzuge die Verarbeitung kleiner rechteckiger Bereiche. |
RS_FOR_EACH_STRATEGY_TILE_MEDIUM = 4 | Mittlere rechteckige Regionen werden bevorzugt verarbeitet. |
RS_FOR_EACH_STRATEGY_TILE_LARGE = 5 | Ich 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-Strategie | Wird derzeit ignoriert. Zukünftig wird eine Strategie zur Iteration von Zellen vorgeschlagen. |
---|---|
uint32_t xStart | Startindex in der Dimension „X“. |
uint32_t xEnd | Endindex (ausschließlich) in der Dimension „X“. |
uint32_t yStart | Startindex in der Dimension „Y“. |
uint32_t yEnd | Endindex (ausschließlich) in der Dimension „Y“ |
uint32_t zStart | Startindex in der Z-Dimension. |
uint32_t zEnde | Endindex (ausschließlich) in der Z-Dimension. |
uint32_t ArrayStart | Startindex in der Dimension Array0. |
uint32_t ArrayEnd | Endindex (ausschließlich) in der Dimension Array0 |
uint32_t Array1Start | Startindex in der Dimension „Array1“. |
uint32_t Array1Ende | Endindex (ausschließlich) in der Dimension Array1 |
uint32_t Array2Start | Startindex in der Dimension Array2. |
uint32_t Array2Ende | Endindex (ausschließlich) in der Dimension Array2 |
uint32_t Array3Start | Startindex in der Dimension Array3. |
uint32_t Array3Ende | Endindex (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
Skript | Skript für den Anruf. |
---|---|
Eingang | Zuordnung zu Quelldaten. |
output | Zuordnung, in die ein Datum geschrieben wird. |
usrData | Benutzerdefinierte Daten, die an das Skript übergeben werden sollen. Kann NULL sein. |
sc | Zusätzliche Kontrollinformationen, mit denen eine Unterregion der Zuweisung für die Verarbeitung ausgewählt oder eine Fußgängerstrategie vorgeschlagen wird. Kann NULL sein. |
usrDataLen | Größe der userData-Struktur. Auf diese Weise wird bei Bedarf eine oberflächliche Kopie der Daten erstellt. |
Kernel | Funktionsbezeichner 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 | |
hasOutput | Gibt an, ob der Kernel eine Ausgabe generiert |
numInputs | Anzahl der Eingabezuweisungen |
Zuweisungen | Eingabe- 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
Kernel | Funktionsbezeichner für eine Funktion, die über das Kernel-Attribut definiert wird. |
---|---|
Optionen | Startoptionen |
… | 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.