Fungsi dan Jenis Pemanggilan Kernel RenderScript

Ringkasan

Fungsi rsForEach() dapat digunakan untuk memanggil kernel root suatu skrip.

Fungsi lainnya digunakan untuk mendapatkan karakteristik pemanggilan kernel yang mengeksekusi, seperti dimensi dan indeks saat ini. Fungsi ini menggunakan rs_kernel_context sebagai argumen.

Ringkasan

Jenis
rs_for_each_strategy_t Urutan pemrosesan sel yang disarankan
rs_kernel Menangani fungsi kernel
konteks_kernel_rs_kernel Menangani konteks pemanggilan kernel
rs_script_call_t Informasi iterasi sel
Fungsi
rsForSetiap Meluncurkan kernel
rsForEachInternal (API Internal) Meluncurkan kernel dalam Skrip saat ini (dengan nomor slot)
rsForEachWithOptions Meluncurkan kernel dengan opsi
rsGetArray0 Indeks dalam dimensi Array0 untuk konteks kernel yang ditentukan
rsGetArray1 Indeks dalam dimensi Array1 untuk konteks kernel yang ditentukan
rsGetArray2 Indeks dalam dimensi Array2 untuk konteks kernel yang ditentukan
rsGetArray3 Indeks dalam dimensi Array3 untuk konteks kernel yang ditentukan
rsGetDimArray0 Ukuran dimensi Array0 untuk konteks kernel yang ditentukan
rsGetDimArray1 Ukuran dimensi Array1 untuk konteks kernel yang ditentukan
rsGetDimArray2 Ukuran dimensi Array2 untuk konteks kernel yang ditentukan
rsGetDimArray3 Ukuran dimensi Array3 untuk konteks kernel yang ditentukan
rsGetDimHasFaces Kehadiran lebih dari satu wajah untuk konteks kernel yang ditentukan
rsGetDimLod Jumlah tingkat detail untuk konteks kernel yang ditentukan
rsGetDimX Ukuran dimensi X untuk konteks kernel yang ditentukan
rsGetDimY Ukuran dimensi Y untuk konteks kernel yang ditentukan
rsGetDimZ Ukuran dimensi Z untuk konteks kernel yang ditentukan
rsGetFace Koordinat Wajah untuk konteks kernel yang ditentukan
rsGetLod Indeks dalam dimensi Tingkat Detail untuk konteks kernel yang ditentukan

Jenis

rs_for_each_strategy_t : Urutan pemrosesan sel yang disarankan

Enum dengan nilai berikut:     

RS_FOR_EACH_STRATEGY_SERIAL = 0Memilih region memori yang berdekatan.
RS_FOR_EACH_STRATEGY_DONT_CARE = 1Tidak ada preferensi.
RS_FOR_EACH_STRATEGY_DST_LINEAR = 2Pilih DST.
RS_FOR_EACH_STRATEGY_TILE_Small = 3Pilih untuk memproses area persegi panjang yang kecil.
RS_FOR_EACH_STRATEGY_TILE_MEDIUM = 4Pilih untuk memproses area persegi panjang sedang.
RS_FOR_EACH_STRATEGY_TILE_LARGE = 5Memilih memproses area persegi panjang yang besar.

Jenis ini digunakan untuk menyarankan cara kernel yang dipanggil harus melakukan iterasi pada sel alokasi. Ini hanyalah petunjuk. Penerapannya mungkin tidak mengikuti saran.

Spesifikasi ini dapat membantu perilaku caching dari kernel yang berjalan, mis. lokalitas cache saat pemrosesan didistribusikan melalui beberapa core.

rs_kernel : Menangani fungsi kernel

Jenis: void*     Ditambahkan di API level 24

Jenis buram untuk fungsi yang ditentukan dengan atribut kernel. Nilai dari jenis ini dapat digunakan dalam panggilan rsForEach untuk meluncurkan kernel.

rs_kernel_context : Menangani konteks pemanggilan kernel

Typedef dari: const struct rs_kernel_context_t *     Ditambahkan di API level 23

Konteks kernel berisi karakteristik umum dari alokasi yang diiterasi, seperti dimensi. Class ini juga berisi indeks yang jarang digunakan dari sel yang sedang diproses, seperti indeks Array0 atau tingkat detail saat ini.

Anda dapat mengakses konteks kernel dengan menambahkan parameter khusus bernama "context" dari jenis rs_kernel_context ke fungsi kernel Anda. Lihat rsGetDimX() dan rsGetArray0() untuk mengetahui contohnya.

rs_script_call_t : Informasi iterasi sel

Struktur dengan kolom berikut:     

strategi rs_for_each_strategy_tSaat ini diabaikan. Di masa mendatang, akan ada saran strategi iterasi sel.
{i>uint32_t xStart<i}Memulai indeks dalam dimensi X.
{i>uint32_t xEnd<i}Indeks akhir (eksklusif) dalam dimensi X.
uint32_t yStartIndeks awal dalam dimensi Y.
uint32_t yEndIndeks akhir (eksklusif) dalam dimensi Y.
uint32_t zStartMemulai indeks dalam dimensi Z.
{i>uint32_t zEnd<i}Indeks akhir (eksklusif) dalam dimensi Z.
{i>uint32_t arrayStart<i}Memulai indeks dalam dimensi Array0.
{i>uint32_t arrayEnd<i}Indeks akhir (eksklusif) dalam dimensi Array0.
uint32_t array1StartIndeks awal dalam dimensi Array1.
{i>uint32_t array1End<i}Indeks akhir (eksklusif) dalam dimensi Array1.
{i>uint32_t array2Start<i}Indeks awal dalam dimensi Array2.
{i>uint32_t array2End<i}Indeks akhir (eksklusif) dalam dimensi Array2.
uint32_t array3StartMemulai indeks dalam dimensi Array3.
{i>uint32_t array3End<i}Indeks akhir (eksklusif) dalam dimensi Array3.

Struktur ini digunakan untuk memberikan informasi iterasi ke panggilan rsForEach. Saat ini sel digunakan untuk membatasi pemrosesan pada subset sel. Pada versi mendatang, teks ini juga akan digunakan untuk memberikan petunjuk tentang cara terbaik untuk melakukan iterasi pada sel-sel.

Kolom Start bersifat inklusif dan kolom End bersifat eksklusif. Misalnya, untuk melakukan iterasi pada sel 4, 5, 6, dan 7 dalam dimensi X, tetapkan xStart ke 4 dan xEnd ke 8.

Fungsi

rsForEach : Meluncurkan kernel

void rsForEvery(rs_kernel kernel, ... ...); Ditambahkan di API level 24
membatalkan rsForEach(skrip rs_script, input rs_allocation, output rs_allocation); Level API 14 - 23
rsForEach(skrip rs_script, input rs_allocation, output rs_allocation, const void* usrData); Dihapus dari API level 14 dan yang lebih tinggi
rsForEach(rs_script, input rs_allocation, output rs_allocation, const void* usrData, const rs_script_call_t* sc); Dihapus dari API level 14 dan yang lebih tinggi
rsForEach(skrip rs_script, input rs_allocation, output rs_allocation, const void* usrData, size_t usrDataLen); Level API 14 - 20
void rsForEach(skrip rs_script, input rs_allocation, output rs_allocation, const void* usrData, size_t usrDataLen, const rs_script_call_t* sc); Level API 14 - 20
Parameter
skripSkrip untuk dipanggil.
inputAlokasi sebagai sumber data.
outputAlokasi untuk menulis tanggal.
usrDataData buatan pengguna untuk diteruskan ke skrip. Mungkin NULL.
scInformasi kontrol tambahan yang digunakan untuk memilih sub-wilayah dari alokasi yang akan diproses atau menyarankan strategi berjalan. Mungkin NULL.
usrDataLenUkuran struktur userData. Ini akan digunakan untuk menyalin data dangkal jika diperlukan.
{i>kernel<i}Penunjuk fungsi ke fungsi yang ditentukan dengan atribut kernel.
...Alokasi input dan output

Menjalankan kernel pada nol atau beberapa alokasi input. Argumen tersebut diteruskan setelah argumen rs_kernel. Jika kernel yang ditentukan menampilkan sebuah nilai, alokasi output harus ditentukan sebagai argumen terakhir. Semua alokasi input, dan alokasi output, jika ada, harus memiliki dimensi yang sama.

Ini adalah fungsi sinkron. Panggilan ke fungsi ini hanya ditampilkan setelah semua pekerjaan selesai untuk semua sel alokasi input. Jika fungsi kernel menampilkan nilai apa pun, panggilan akan menunggu hingga semua hasil ditulis ke alokasi output.

Hingga API level 23, kernel secara implisit ditetapkan sebagai kernel yang bernama "root" dalam skrip yang ditentukan, dan hanya satu alokasi input yang dapat digunakan. Mulai API level 24, fungsi kernel arbitrer dapat digunakan, seperti yang ditetapkan oleh argumen kernel. Argumen skrip dihapus. Kernel harus ditetapkan dalam skrip saat ini. Selain itu, lebih dari satu input dapat digunakan.

Misalnya,
float __attribute__((kernel)) square(float a) {
  return a * a;
}

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

rsForSetiapInternal : (API Internal) Meluncurkan kernel dalam Skrip saat ini (dengan nomor slot)

void rsForEachInternal(int slot, rs_script_call_t* options, int hasOutput, int numInputs, rs_allocation* allocs); Ditambahkan di API level 24
Parameter
slot
opsi
hasOutputMenunjukkan apakah kernel menghasilkan output
numInputJumlah alokasi input
alokasiAlokasi input dan output

API internal untuk meluncurkan kernel.

rsForEachWithOptions : Meluncurkan kernel dengan berbagai opsi

void rsForEachWithOptions(kernel rs_kernel, rs_script_call_t* options, ... ...); Ditambahkan di API level 24
Parameter
{i>kernel<i}Penunjuk fungsi ke fungsi yang ditentukan dengan atribut kernel.
opsiOpsi peluncuran
...Alokasi input dan output

Meluncurkan kernel dengan cara yang mirip dengan rsForEach. Namun, fungsi ini hanya memproses sel di subruang indeks yang ditentukan dalam opsi, bukan memproses semua sel dalam input. Dengan ruang indeks yang ditentukan secara eksplisit oleh opsi, tidak diperlukan alokasi input atau output untuk peluncuran kernel menggunakan API ini. Jika diteruskan, alokasi harus cocok dengan jumlah argumen dan nilai hasil yang diharapkan oleh fungsi kernel. Alokasi output ada jika dan hanya jika kernel memiliki nilai yang ditampilkan non-void.

Misalnya,
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 dalam dimensi Array0 untuk konteks kernel yang ditentukan

uint32_t rsGetArray0(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan indeks dalam dimensi Array0 dari sel yang sedang diproses, seperti yang ditentukan oleh konteks kernel yang disediakan.

Konteks kernel berisi karakteristik umum dari alokasi yang diiterasi dan indeks yang jarang digunakan, seperti indeks Array0.

Anda dapat mengakses konteks kernel dengan menambahkan parameter khusus bernama "context" dengan jenis rs_kernel_context ke fungsi kernel Anda. Misalnya,
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);
  //...
}

Fungsi ini mengembalikan 0 jika dimensi Array0 tidak ada.

rsGetArray1 : Indeks dalam dimensi Array1 untuk konteks kernel yang ditentukan

uint32_t rsGetArray1(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan indeks dalam dimensi Array1 dari sel yang sedang diproses, seperti yang ditentukan oleh konteks kernel yang disediakan. Lihat rsGetArray0() untuk mendapatkan penjelasan konteks.

Mengembalikan 0 jika dimensi Array1 tidak ada.

rsGetArray2 : Indeks dalam dimensi Array2 untuk konteks kernel yang ditentukan

uint32_t rsGetArray2(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan indeks dalam dimensi Array2 dari sel yang sedang diproses, seperti yang ditentukan oleh konteks kernel yang disediakan. Lihat rsGetArray0() untuk mendapatkan penjelasan konteks.

Mengembalikan 0 jika dimensi Array2 tidak ada.

rsGetArray3 : Indeks dalam dimensi Array3 untuk konteks kernel yang ditentukan

uint32_t rsGetArray3(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan indeks dalam dimensi Array3 dari sel yang sedang diproses, seperti yang ditentukan oleh konteks kernel yang disediakan. Lihat rsGetArray0() untuk mendapatkan penjelasan konteks.

Mengembalikan 0 jika dimensi Array3 tidak ada.

rsGetDimArray0 : Ukuran dimensi Array0 untuk konteks kernel yang ditentukan

uint32_t rsGetDimArray0(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan ukuran dimensi Array0 untuk konteks kernel yang ditentukan. Lihat rsGetDimX() untuk penjelasan konteks.

Mengembalikan 0 jika dimensi Array0 tidak ada.

rsGetDimArray1 : Ukuran dimensi Array1 untuk konteks kernel yang ditentukan

uint32_t rsGetDimArray1(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan ukuran dimensi Array1 untuk konteks kernel yang ditentukan. Lihat rsGetDimX() untuk penjelasan konteks.

Mengembalikan 0 jika dimensi Array1 tidak ada.

rsGetDimArray2 : Ukuran dimensi Array2 untuk konteks kernel yang ditentukan

uint32_t rsGetDimArray2(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan ukuran dimensi Array2 untuk konteks kernel yang ditentukan. Lihat rsGetDimX() untuk penjelasan konteks.

Mengembalikan 0 jika dimensi Array2 tidak ada.

rsGetDimArray3 : Ukuran dimensi Array3 untuk konteks kernel yang ditentukan

uint32_t rsGetDimArray3(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan ukuran dimensi Array3 untuk konteks kernel yang ditentukan. Lihat rsGetDimX() untuk penjelasan konteks.

Mengembalikan 0 jika dimensi Array3 tidak ada.

rsGetDimHasFaces : Kehadiran lebih dari satu wajah untuk konteks kernel yang ditentukan

bool rsGetDimHasFaces(konteks rs_kernel_context); Ditambahkan di API level 23
Return
Menampilkan true jika ada lebih dari satu wajah, false jika tidak.

Jika kernel melakukan iterasi pada peta kubus, fungsi ini akan menampilkan nilai benar (true) jika ada lebih dari satu wajah. Dalam semua kasus lain, nilai salah (false) akan ditampilkan. Lihat rsGetDimX() untuk mendapatkan penjelasan konteks.

rsAllocationGetDimFaces() serupa, tetapi menampilkan 0 atau 1, bukan bool.

rsGetDimLod : Jumlah tingkat detail untuk konteks kernel yang ditentukan

uint32_t rsGetDimLod(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan jumlah tingkat detail untuk konteks kernel yang ditentukan. Hal ini berguna untuk mipmap. Lihat rsGetDimX() untuk penjelasan konteks.

Mengembalikan 0 jika Level of Detail tidak digunakan.

rsAllocationGetDimLOD() serupa, tetapi menampilkan 0 atau 1 sebagai jumlah level sebenarnya.

rsGetDimX : Ukuran dimensi X untuk konteks kernel yang ditentukan

uint32_t rsGetDimX(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan ukuran dimensi X untuk konteks kernel yang ditentukan.

Konteks kernel berisi karakteristik umum dari alokasi yang diiterasi dan indeks yang jarang digunakan, seperti indeks Array0.

Anda dapat mengaksesnya dengan menambahkan parameter khusus bernama "context" dengan jenis rs_kernel_context ke fungsi kernel Anda. Misalnya,
int4 RS_KERNEL myKernel(int4 value, rs_kernel_context context) {
  uint32_t size = rsGetDimX(context); //...

Untuk mendapatkan dimensi alokasi spesifik, gunakan rsAllocationGetDimX().

rsGetDimY : Ukuran dimensi Y untuk konteks kernel yang ditentukan

uint32_t rsGetDimY(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan ukuran dimensi X untuk konteks kernel yang ditentukan. Lihat rsGetDimX() untuk penjelasan konteks.

Mengembalikan 0 jika dimensi Y tidak ada.

Untuk mendapatkan dimensi alokasi spesifik, gunakan rsAllocationGetDimY().

rsGetDimZ : Ukuran dimensi Z untuk konteks kernel yang ditentukan

uint32_t rsGetDimZ(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan ukuran dimensi Z untuk konteks kernel yang ditentukan. Lihat rsGetDimX() untuk penjelasan konteks.

Mengembalikan 0 jika dimensi Z tidak ada.

Untuk mendapatkan dimensi alokasi spesifik, gunakan rsAllocationGetDimZ().

rsGetFace : Koordinat Wajah untuk konteks kernel yang ditentukan

rs_allocation_cubemap_face rsGetFace(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan wajah tempat sel yang sedang diproses ditemukan, seperti yang ditetapkan oleh konteks kernel yang disediakan. Lihat rsGetArray0() untuk mendapatkan penjelasan konteks.

Menampilkan RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X jika dimensi wajah tidak ada.

rsGetLod : Indeks dalam dimensi Tingkat Detail untuk konteks kernel yang ditentukan

uint32_t rsGetLod(konteks rs_kernel_context); Ditambahkan di API level 23

Menampilkan indeks dalam dimensi Tingkat Detail sel yang sedang diproses, seperti yang ditentukan oleh konteks kernel yang disediakan. Lihat rsGetArray0() untuk mendapatkan penjelasan tentang konteksnya.

Menampilkan 0 jika Tingkat dimensi Detail tidak ada.