Funkcje i typy wywoływania jądra skryptu RenderScript

Przegląd

Funkcja rsForEach() może służyć do wywołania głównego jądra skryptu.

Pozostałe funkcje służą do sprawdzania właściwości wywołania wykonywanego jądra, np. wymiarów i bieżących indeksów. Funkcje te przyjmują argument rs_kernel_context.

Podsumowanie

Rodzaje
rs_for_each_strategy_t Sugerowana kolejność przetwarzania komórek
rs_kernel Uchwyć do funkcji jądra
rs_kernel_context Uchwyt do kontekstu wywołania jądra
rs_script_call_t Informacje o iteracji komórki
Funkcje
rsForEach Uruchamia jądro
rsForEachInternal (Wewnętrzny interfejs API) Uruchamianie jądra w bieżącym skrypcie (z numerem przedziału)
rsForEachWithOptions Uruchamia jądro z opcjami
rsGetTrack0 Indeks w wymiarze tablica0 dla określonego kontekstu jądra
rsGetSlate1 Indeks w wymiarze tablica1 dla określonego kontekstu jądra
rsGetTrack2 Indeks w wymiarze Tablica2 dla określonego kontekstu jądra
rsGetTrack3 Indeks w wymiarze Array3 dla określonego kontekstu jądra
rsGetDimTrack0 Rozmiar wymiaru tablica0 dla określonego kontekstu jądra
rsGetDimSlate1 Rozmiar wymiaru tablica1 dla określonego kontekstu jądra
rsGetDimSlate2 Rozmiar wymiaru tablica2 dla określonego kontekstu jądra
rsGetDimSlate3 Rozmiar wymiaru Array3 dla określonego kontekstu jądra
rsGetDimHasFaces Obecność więcej niż jednej twarzy w określonym kontekście jądra
rsGetDimLod Liczba poziomów szczegółowości dla określonego kontekstu jądra
rsGetDimX Rozmiar wymiaru X dla określonego kontekstu jądra
rsGetDimY Rozmiar wymiaru Y dla określonego kontekstu jądra
rsGetDimZ Rozmiar wymiaru Z dla określonego kontekstu jądra
rsGetFace Współrzędne twarzy dla określonego kontekstu jądra
rsGetLod Indeks w wymiarze Poziomy szczegółów dla określonego kontekstu jądra

Rodzaje

rs_for_each_strategy_t : sugerowana kolejność przetwarzania komórek

enum z tymi wartościami:     

RS_FOR_EACH_STRATEGY_SERIAL = 0Preferuj przylegające regiony pamięci.
RS_FOR_EACH_STRATEGY_DONT_CARE = 1Brak uprzedzeń.
RS_FOR_EACH_STRATEGY_DST_LINEAR = 2Wolę czas letni.
RS_FOR_EACH_STRATEGY_TILE_SMALL = 3Preferuj przetwarzanie małych prostokątnych regionów.
RS_FOR_EACH_STRATEGY_TILE_MEDIUM = 4Preferuj przetwarzanie średnich prostokątnych regionów.
RS_FOR_EACH_STRATEGY_TILE_LARGE = 5Preferuj przetwarzanie dużych prostokątnych regionów.

Ten typ służy do sugerowania sposobu, w jaki wywoływane jądro powtarza się na komórkach alokacji. To tylko podpowiedź. Implementacje mogą nie być zgodne z sugestią.

Ta specyfikacja może pomóc w zachowaniu buforowania w działającym jądrze, np. w lokalizacji pamięci podręcznej, gdy przetwarzanie jest rozłożone na wiele rdzeni.

rs_kernel : obsługa funkcji jądra

Element typedef: void*     Dodano w poziomie interfejsu API 24.

Typ nieprzezroczysty dla funkcji zdefiniowanej za pomocą atrybutu jądra. Wartości tego typu można użyć w wywołaniu rsForEach, aby uruchomić jądro.

rs_kernel_context : obsługa kontekstu wywołania jądra

Element typedef: const struct rs_kernel_context_t *     Dodano w poziomie interfejsu API 23

Kontekst jądra zawiera typowe cechy powtarzanych przydziałów, np. wymiary. Zawiera też rzadko używane indeksy obecnie przetwarzanej komórki, takie jak indeks tablica0 lub bieżący poziom szczegółowości.

Aby uzyskać dostęp do kontekstu jądra, dodaj do funkcji jądra specjalny parametr o nazwie „context” typu rs_kernel_context. Przykłady znajdziesz w sekcjach rsGetDimX() i rsGetArray0().

rs_script_call_t : informacje o iteracji komórki

strukturę z tymi polami:     

strategia rs_for_each_strategy_tObecnie ignorowane. W przyszłości pojawi się sugerowana strategia iteracji komórek.
uint32_t xStartIndeks początkowy w wymiarze X.
uint32_t xEndIndeks końcowy (wyłącznie) w wymiarze X.
uint32_t yStartIndeks początkowy w wymiarze Y.
uint32_t yEndIndeks końcowy (wyłącznie) w wymiarze Y.
uint32_t zStartIndeks początkowy w wymiarze Z.
uint32_t zEndIndeks końcowy (wyłącznie) w wymiarze Z.
uint32_t Początek tablicyIndeks początkowy w wymiarze tablica0.
uint32_t tableEndIndeks końcowy (wyłącznie) w wymiarze Tablica0.
uint32_t tablica1StartIndeks początkowy w wymiarze tablica1.
uint32_t tablica1EndIndeks końcowy (wyłącznie) w wymiarze Tablica1.
uint32_t tablica2StartIndeks początkowy w wymiarze tablica2.
uint32_t tablica2EndIndeks końcowy (wyłącznie) w wymiarze Tablica2.
uint32_t tablica3StartIndeks początkowy w wymiarze Array3.
uint32_t tablica3EndIndeks końcowy (wyłącznie) w wymiarze Tablica3.

Ta struktura służy do dostarczania informacji o iteracji do wywołania rsForEach. Obecnie używa się go do ograniczania przetwarzania do podzbioru komórek. W przyszłych wersjach będzie on też służyć jako wskazówka co do tego, jak najlepiej wykonać iterację w komórkach.

Pola „Początek” uwzględniają zarówno te pola, jak i końcowe. Aby np. iterować komórki 4, 5, 6 i 7 w wymiarze X, jako xStart ustaw wartość 4, a xEnd na 8.

Funkcje

rsForEach : uruchamia jądro

void rsForEach(kernel rs_kernel, ... ...); Dodano do poziomu interfejsu API 24.
void rsForEach(skrypt rs_script, dane wejściowe rs_allocation, dane wyjściowe rs_allocation); Poziom API 14–23
void rsForEach(skrypt rs_script, dane wejściowe rs_allocation, dane wyjściowe rs_allocation, const void* usrData); Usunięto z interfejsu API na poziomie 14 lub wyższym.
void rsForEach(skrypt rs_script, dane wejściowe rs_allocation, dane wyjściowe rs_allocation, const void* usrData, const rs_script_call_t* sc); Usunięto z interfejsu API na poziomie 14 lub wyższym.
void rsForEach(skrypt rs_script, dane wejściowe rs_allocation, dane wyjściowe rs_allocation, const void* usrData, size_t usrDataLen); Poziom API 14–20
void rsForEach(skrypt rs_script, dane wejściowe rs_allocation, dane wyjściowe rs_allocation, const void* usrData, size_t usrDataLen, const rs_script_call_t* sc); Poziom API 14–20
Parametry
skryptSkrypt do wywołania.
wejściePrzydział do danych źródłowych.
outputPrzydział zapisu daty.
dane usrDataDane zdefiniowane przez użytkownika, które mają zostać przekazane do skryptu. Może zawierać wartość NULL.
scInformacje dodatkowe używane do wyboru podregionu przydziału do przetworzenia lub zaproponowania strategii dotyczącej spacerów. Może zawierać wartość NULL.
usrDataLenRozmiar struktury userData. W razie potrzeby będzie to umożliwiało utworzenie niewielkiej kopii danych.
jądroOznaczenie funkcji dla funkcji zdefiniowanej za pomocą atrybutu jądra.
Przydziały danych wejściowych i wyjściowych

Uruchamia jądro przy zerowym lub większej liczbie przydziałów wejściowych. Są one przekazywane po argumencie rs_kernel. Jeśli określone jądro zwraca wartość, przydział danych wyjściowych musi być określony jako ostatni argument. Wszystkie przydziały wejściowe i przydział danych wyjściowych (jeśli istnieje) muszą mieć te same wymiary.

Jest to funkcja synchroniczna. Wywołanie tej funkcji zwraca się dopiero po zakończeniu pracy dotyczącej wszystkich komórek alokacji wejściowych. Jeśli funkcja jądra zwraca dowolną wartość, wywołanie czeka, aż wszystkie wyniki zostaną zapisane w alokacji wyjściowej.

Do poziomu interfejsu API 23 jądro jest domyślnie określone jako jądro o nazwie „root” w określonym skrypcie i może być używany tylko jeden przydział danych wejściowych. Od poziomu interfejsu API 24 można używać dowolnej funkcji jądra, zgodnie z wartością argumentu jądra. Argument skryptu zostanie usunięty. Jądro musi być zdefiniowane w bieżącym skrypcie. Można też użyć więcej niż 1 danych wejściowych.

Na przykład:
float __attribute__((kernel)) square(float a) {
  return a * a;
}

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

rsForEachInternal : (wewnętrzny interfejs API) uruchom jądro w bieżącym skrypcie (z użyciem numeru przedziału)

void rsForEachInternal(int slot, rs_script_call_t* options, int hasoutput, int numInputs, rs_allocation* allocs); Dodano do poziomu interfejsu API 24.
Parametry
przedział czasu
Opcje
hasoutputWskazuje, czy jądro generuje dane wyjściowe
Liczba wejśćLiczba przydziałów danych wejściowych
przydzielaniePrzydziały danych wejściowych i wyjściowych

Wewnętrzny interfejs API umożliwiający uruchomienie jądra.

rsForEachWithOptions : uruchamia jądro z opcjami

void rsForEachWithOptions(jądro rs_kernel, opcje rs_script_call_t*, ... ...); Dodano do poziomu interfejsu API 24.
Parametry
jądroOznaczenie funkcji dla funkcji zdefiniowanej za pomocą atrybutu jądra.
OpcjeOpcje uruchamiania
Przydziały danych wejściowych i wyjściowych

Uruchamia jądro w sposób podobny do rsForEach. Jednak zamiast przetwarzania wszystkich komórek w danych wejściowych ta funkcja przetwarza tylko komórki znajdujące się w podprzestrzeni przestrzeni indeksu określonej w opcjach. W przypadku przestrzeni indeksu wyraźnie określonej przez opcje do uruchomienia jądra za pomocą tego interfejsu API nie są wymagane żadne przydziały danych wejściowych ani wyjściowych. Jeśli alokacje są przekazywane, muszą być zgodne z liczbą argumentów i wartością oczekiwaną przez funkcję jądra. Przydział wyjściowy jest widoczny tylko wtedy, gdy jądro zawiera niepustą wartość zwracaną.

Na przykład:
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 : indeks w wymiarze Array0 dla określonego kontekstu jądra

uint32_t rsGetTrack0(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.

Zwraca indeks w wymiarze tablica0 przetwarzanej komórki, zgodnie z podanym kontekstem jądra.

Kontekst jądra zawiera typowe cechy powtarzanych przydziałów i rzadko używane indeksy, takie jak indeks Array0.

Aby uzyskać dostęp do kontekstu jądra, dodaj do funkcji jądra specjalny parametr o nazwie „context” typu rs_kernel_context. Np.
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);
  //...
}

Jeśli nie ma wymiaru Tablica0, ta funkcja zwraca wartość 0.

rsGetArray1 : indeks w wymiarze Array1 dla określonego kontekstu jądra

uint32_t rsGetArray1(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.

Zwraca indeks w wymiarze tablica1 przetwarzanej komórki, zgodnie z podanym kontekstem jądra. Aby dowiedzieć się więcej o kontekście, zobacz funkcję rsGetArray0().

Zwraca wartość 0, jeśli nie ma wymiaru tablica1.

rsGetArray2 : indeks w wymiarze tablica2 dla określonego kontekstu jądra

uint32_t rsGetArray2(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.

Zwraca indeks w wymiarze tablicy2 przetwarzanej komórki, zgodnie z podanym kontekstem jądra. Aby dowiedzieć się więcej o kontekście, zapoznaj się z funkcją rsGetArray0().

Zwraca wartość 0, jeśli nie ma wymiaru Tablica2.

rsGetArray3 : indeks w wymiarze Array3 dla określonego kontekstu jądra

uint32_t rsGetArray3(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.

Zwraca indeks w wymiarze tablica3 przetwarzanej komórki, zgodnie z podanym kontekstem jądra. Aby dowiedzieć się więcej o kontekście, zobacz funkcję rsGetArray0().

Zwraca wartość 0, jeśli nie ma wymiaru Array3.

rsGetDimArray0 : rozmiar wymiaru Array0 dla określonego kontekstu jądra

uint32_t rsGetDimTrack0(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.

Zwraca rozmiar wymiaru tablica0 dla określonego kontekstu jądra. Aby poznać kontekst, zobacz funkcję rsGetDimX().

Zwraca wartość 0, jeśli nie ma wymiaru tablica0.

rsGetDimArray1 : rozmiar wymiaru Array1 dla określonego kontekstu jądra

uint32_t rsGetDimArray1(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.

Zwraca rozmiar wymiaru tablica1 dla określonego kontekstu jądra. Aby poznać kontekst, zobacz funkcję rsGetDimX().

Zwraca wartość 0, jeśli nie ma wymiaru tablica1.

rsGetDimArray2 : rozmiar wymiaru Array2 dla określonego kontekstu jądra

uint32_t rsGetDimArray2(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.

Zwraca rozmiar wymiaru Tablica2 dla określonego kontekstu jądra. Aby poznać kontekst, zobacz funkcję rsGetDimX().

Zwraca wartość 0, jeśli nie ma wymiaru Tablica2.

rsGetDimArray3 : rozmiar wymiaru Array3 dla określonego kontekstu jądra

uint32_t rsGetDimArray3(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.

Zwraca rozmiar wymiaru Array3 dla określonego kontekstu jądra. Aby poznać kontekst, zobacz funkcję rsGetDimX().

Zwraca wartość 0, jeśli nie ma wymiaru Array3.

rsGetDimHasFaces : obecność więcej niż 1 twarzy w określonym kontekście jądra

bool rsGetDimHasFaces(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.
Zwroty
Zwraca wartość „true”, jeśli występuje więcej niż jedna twarz. W przeciwnym razie zwraca wartość „false”.

Jeśli jądro iteruje się na mapie sześcianu, funkcja zwraca wartość „prawda”, jeśli występuje więcej niż 1 twarz. W pozostałych przypadkach zwraca wartość „fałsz”. Objaśnienie kontekstu znajdziesz w sekcji rsGetDimX().

Funkcja rsAllocationGetDimFaces() jest podobna, ale zwraca 0 lub 1 zamiast wartości logicznej.

rsGetDimLod : liczba poziomów szczegółowości dla określonego kontekstu jądra

uint32_t rsGetDimLod(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.

Zwraca liczbę poziomów szczegółów dla określonego kontekstu jądra. Jest to przydatne w przypadku mipmap. Aby poznać kontekst, zobacz funkcję rsGetDimX().

Zwraca wartość 0, jeśli nie użyto parametru Poziom szczegółowości.

Funkcja rsAllocationGetDimLOD() jest podobna, ale zwraca rzeczywistą liczbę poziomów 0 lub 1.

rsGetDimX : rozmiar wymiaru X dla określonego kontekstu jądra

Zwraca rozmiar wymiaru X dla określonego kontekstu jądra.

Kontekst jądra zawiera typowe cechy powtarzanych przydziałów i rzadko używane indeksy, takie jak indeks Array0.

Aby uzyskać do niego dostęp, dodaj do funkcji jądra specjalny parametr o nazwie „context” typu rs_kernel_context. Np.
int4 RS_KERNEL myKernel(int4 value, rs_kernel_context context) {
  uint32_t size = rsGetDimX(context); //...

Aby uzyskać wymiar określonego przydziału, użyj funkcji rsAllocationGetDimX().

rsGetDimY : rozmiar wymiaru Y dla określonego kontekstu jądra

uint32_t rsGetDimY(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.

Zwraca rozmiar wymiaru X dla określonego kontekstu jądra. Aby poznać kontekst, zobacz funkcję rsGetDimX().

Zwraca wartość 0, jeśli nie ma wymiaru Y.

Aby uzyskać wymiar określonego przydziału, użyj funkcji rsAllocationGetDimY().

rsGetDimZ : rozmiar wymiaru Z dla określonego kontekstu jądra

uint32_t rsGetDimZ(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.

Zwraca rozmiar wymiaru Z dla określonego kontekstu jądra. Aby poznać kontekst, zobacz funkcję rsGetDimX().

Zwraca wartość 0, jeśli nie ma wymiaru Z.

Aby uzyskać wymiar określonego przydziału, użyj funkcji rsAllocationGetDimZ().

rsGetFace : współrzędne twarzy w określonym kontekście jądra

Zwraca twarz, na której znajduje się przetwarzana komórka, zgodnie z podanym kontekstem jądra. Aby dowiedzieć się więcej o kontekście, zobacz funkcję rsGetArray0().

Jeśli wymiar twarzy nie jest podany, zwraca wartość RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X.

rsGetLod : indeks w wymiarze Poziomy szczegółów dla określonego kontekstu jądra.

uint32_t rsGetLod(kontekst rs_kernel_context); Dodano do poziomu interfejsu API 23.

Zwraca indeks w wymiarze Poziomy szczegółów przetwarzanej komórki, zgodnie z podanym kontekstem jądra. Informacje o kontekście znajdziesz w opisie funkcji rsGetArray0().

Zwraca wartość 0, jeśli brakuje wymiaru Poziomy szczegółowości.