blob: 2e386d2798daa814398d7e9453bb17b369ccf3e6 [file] [log] [blame]
Miao Wang4772b602017-01-20 10:30:38 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.hardware.renderscript@1.0;
18
19import android.hardware.renderscript@1.0::types;
20
21// TODO: is there any way to keep this documentation in sync with the
22// corresponding Java doc?
23//
24// TODO: Some of the documentation was taken from Java docs, whereas others were
25// undocumented. Because of this, there's somewhat two different styles of
26// comments. Look into having a consistent convention.
27//
28// TODO: There was some confusion as to why some paramters use vec<> and others
29// use Ptr/Size. The convention is that vec<> is used whenever the paramter is
30// only an input parameter. HIDL is not supposed to include any output
31// parameters, so a more explicit Ptr/Size is used.
32
33interface IContext {
34
35 /*
36 * TODO: Do we need to define "selectors"? It may be a property of the
37 * "adapted allocation" that's returned.
38 *
39 * Creates an arbitrary window into the base allocation. The type describes
40 * the shape of the window. Any dimensions present in the type must be
41 * equal to or smaller than the dimensions in the source allocation. A
42 * dimension present in the allocation that is not present in the type must
43 * be constrained away with the selectors. If a dimension is present in
44 * both the type and allocation, one of two things must happen. If the type
45 * is smaller than the allocation, a window must be created, the selected
46 * value in the adapter for that dimension must act as the base address,
47 * and the type must describe the size of the view starting at that point.
48 * If the type and allocation dimension are of the same size, then setting
49 * the selector for the dimension must be an error.
50 *
51 * @param type Type describing data layout
52 * @param baseAlloc Allocation
53 * @return subAlloc AllocationAdapter
54 */
55 @callflow(next={"*"})
56 allocationAdapterCreate(Type type, Allocation baseAlloc)
57 generates (AllocationAdapter subAlloc);
58
59 /*
60 * TODO: Need to relate "offset" back to the terminology in
61 * allocationAdapterCreate() -- the latter uses the terms "selector" and
62 * "selected value". Can we use consistent terminology? Are "offset" and
63 * "selector" actually two different things?
64 *
65 * TODO: Explain the flattened layout in the offsets vec
66 *
67 * Sets the offsets for an Allocation Adapter.
68 *
69 * @param alloc AllocationAdapter
70 * @param offsets Collection of offsets
71 */
72 @callflow(next={"*"})
73 allocationAdapterOffset(AllocationAdapter alloc, vec<uint32_t> offsets);
74
75 /*
76 * TODO: add more explanation here.
77 *
78 * Returns the Type of the Allocation.
79 *
80 * @param allocation Allocation
81 * @return type Allocation's Type
82 */
83 @callflow(next={"*"})
84 allocationGetType(Allocation allocation) generates (Type type);
85
86 /*
87 * TODO: more clarification needed describing if the pointer can be aliased
88 * or if the data can outlive the allocation.
89 *
90 * Creates an Allocation for use by scripts with a given Type and a backing
91 * pointer. For use with ALLOCATION_USAGE_SHARED.
92 *
93 * @param type Type describing data layout
94 * @param mips AllocationMipmapControl specifies desired mipmap behavior for
95 * the allocation
96 * @param usage Bit field specifying how the Allocation is utilized
97 * @param ptr Pointer to client-side data
98 * @return allocation Created Allocation
99 */
100 @callflow(next={"*"})
101 allocationCreateTyped(Type type, AllocationMipmapControl mips,
102 bitfield<AllocationUsageType> usage, Ptr ptr)
103 generates (Allocation allocation);
104
105 /*
106 * Creates an Allocation from a Bitmap.
107 *
108 * @param type Type describing data layout
109 * @param mips AllocationMipmapControl specifies desired mipmap behavior for
110 * the allocation
111 * @param bitmap Bitmap source for the allocation data
112 * @param usage Bit field specifying how the Allocation is utilized
113 * @return allocation Created Allocation containing bitmap data
114 */
115 @callflow(next={"*"})
116 allocationCreateFromBitmap(Type type, AllocationMipmapControl mips,
117 vec<uint8_t> bitmap,
118 bitfield<AllocationUsageType> usage)
119 generates (Allocation allocation);
120
121 /*
122 * Creates a Cubemapped Allocation from a Bitmap.
123 *
124 * @param type Type describing data layout
125 * @param mips AllocationMipmapControl specifies desired mipmap behavior
126 * for the allocation
127 * @param bitmap Bitmap with cubemap faces layed out in the following
128 * format: right, left, top, bottom, front, back
129 * @param usage Bit field specifying how the Allocation is used
130 * @return allocation Created Allocation containing cubemap data
131 */
132 @callflow(next={"*"})
133 allocationCubeCreateFromBitmap(Type type, AllocationMipmapControl mips,
134 vec<uint8_t> bitmap,
135 bitfield<AllocationUsageType> usage)
136 generates (Allocation allocation);
137
138 /*
139 * Returns the handle to a raw buffer that is being managed by the screen
140 * compositor. This operation is only valid for Allocations with
141 * USAGE_IO_INPUT.
142 *
143 * @param allocation Allocation
144 * @return nativeWindow NativeWindow object associated with allocation
145 */
146 @callflow(next={"*"})
147 allocationGetNativeWindow(Allocation allocation)
148 generates (NativeWindow nativeWindow);
149
150 /*
151 * TODO: more clarification needed
152 *
153 * Sets the NativeWindow of an Allocation. This operation is only valid
154 * for Allocations with USAGE_IO_INPUT.
155 *
156 * @param allocation Allocation to be modified
157 * @pram nativeWindow NativeWindow to associate with allocation
158 */
159 @callflow(next={"*"})
160 allocationSetNativeWindow(Allocation allocation, NativeWindow nativewindow);
161
162 /*
163 * Initialize BufferQueue with specified max number of buffers.
164 *
165 * @param alloc Allocation
166 * @param numBuffer Maximum number of buffers
167 */
168 @callflow(next={"*"})
169 allocationSetupBufferQueue(Allocation alloc, uint32_t numBuffer);
170
171 /*
172 * TODO: clearly define baseAlloc vs subAlloc
173 *
174 * Shares the BufferQueue with another Allocation. Both must be
175 * USAGE_IO_INPUT Allocations.
176 *
177 * @param baseAlloc Base Allocation
178 * @param subAlloc Allocation to use the same buffer queue as the Base
179 * Allocation
180 */
181 @callflow(next={"*"})
182 allocationShareBufferQueue(Allocation baseAlloc, Allocation subAlloc);
183
184 /*
185 * Copies from the Allocation into a Bitmap. The bitmap must match the
186 * dimensions of the Allocation.
187 *
188 * HIDL is always running in Passthrough mode for RenderScript, so the
189 * buffer is modified directly by the driver.
190 *
191 * @param allocation Allocation
192 * @param data Buffer to be copied into
193 * @param sizeBytes Size of the buffer pointed to by "data"
194 */
195 @callflow(next={"*"})
196 allocationCopyToBitmap(Allocation allocation, Ptr data, Size sizeBytes);
197
198 /*
199 * TODO: should we consolidate all [123]DWrite functions or [123]DRead
200 * functions into the same API call? Our current plan is to be very similar
201 * to the dispatch table API. How much should we deviate from the original
202 * API?
203 * TODO: better description on Vec3/Vec4 and padding.
204 *
205 * Copies data into a 1D region of this Allocation.
206 *
207 * When this HAL entry is executed, all Vec3 elements have been explicitly
208 * padded as Vec4 elements.
209 *
210 * The size of the region is: count * Element's size.
211 *
212 * @param allocation Allocation to be modified
213 * @param offset The offset of the first element to be copied
214 * @param lod Selected mipmap level of detail
215 * @param count Number of elements to be copied
216 * @param data Source data to be copied to Allocation
217 */
218 @callflow(next={"*"})
219 allocation1DWrite(Allocation allocation, uint32_t offset, uint32_t lod,
220 uint32_t count, vec<uint8_t> data);
221
222 /*
223 * Copies a value into a single sub-Element of this Allocation.
224 *
225 * @param allocation Allocation to be updated
226 * @param x X position of the first element in the Allocation to be updated
227 * @param y Y position of the first element in the Allocation to be
228 * updated; for a 1D Allocation, this value must be 0
229 * @param z Z position of the first element in the Allocation to be
230 * updated; for a 1D or 2D Allocation, this value must be 0
231 * @param lod Selected mipmap level of detail
232 * @param data Data to be copied from
233 * @param compIdx Component number to identify which sub-Element is updated
234 */
235 @callflow(next={"*"})
236 allocationElementWrite(Allocation allocation, uint32_t x, uint32_t y,
237 uint32_t z, uint32_t lod, vec<uint8_t> data,
238 Size compIdx);
239
240 /*
241 * Copies from an array into a rectangular region in this Allocation.
242 *
243 * When this HAL entry is executed, all Vec3 elements have been explicitly
244 * padded as Vec4 elements.
245 *
246 * The size of the region is: w * h * Element's size.
247 *
248 * @param allocation Allocation to be modified
249 * @param xoff X offset of the region to update in this Allocation
250 * @param yoff Y offset of the region to update in this Allocation
251 * @param lod Selected mipmap level of detail
252 * @param face AllocationCubemapFace
253 * @param w Width of the region to update
254 * @param h Height of the region to update
255 * @param data Data to be placed into the Allocation
256 * @param stride For 1D Allocation, the stride must be the number of bytes
257 * of this Allocation. For 2D and 3D Allocations, the stride
258 * must be the stride in X dimension measuring in bytes.
259 */
260 @callflow(next={"*"})
261 allocation2DWrite(Allocation allocation, uint32_t xoff, uint32_t yoff,
262 uint32_t lod, AllocationCubemapFace face, uint32_t w,
263 uint32_t h, vec<uint8_t> data, Size stride);
264
265 /*
266 * Copies from an array into a 3D region in this Allocation.
267 *
268 * When this HAL entry is executed, all Vec3 elements have been explicitly
269 * padded as Vec4 elements.
270 *
271 * The size of the region is: w * h * d * Element's size.
272 *
273 * @param allocation Allocation to be modified
274 * @param xoff X offset of the region to update in this Allocation
275 * @param yoff Y offset of the region to update in this Allocation
276 * @param zoff Z offset of the region to update in this Allocation
277 * @param lod Selected mipmap level of detail
278 * @param w Width of the region to update
279 * @param h Height of the region to update
280 * @param d Depth of the region to update
281 * @param data Data to be placed in the Allocation
282 * @param stride For 1D Allocation, the stride must be the number of bytes
283 * of this Allocation. For 2D and 3D Allocations, the stride
284 * must be the stride in X dimension measuring in bytes.
285 */
286 @callflow(next={"*"})
287 allocation3DWrite(Allocation allocation, uint32_t xoff, uint32_t yoff,
288 uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h,
289 uint32_t d, vec<uint8_t> data, Size stride);
290
291 /*
292 * Generates a mipmap chain. This is only valid if the Type of the
293 * Allocation includes mipmaps.
294 *
295 * This function generates a complete set of mipmaps from the top level
296 * LOD.
297 *
298 * If the Allocation is also using other memory spaces, a call to
299 * allocationSyncAll(context, allocation, usage) is required.
300 *
301 * @param allocation Allocation which has its top LOD read and lower LOD
302 * written to
303 */
304 @callflow(next={"*"})
305 allocationGenerateMipmaps(Allocation allocation);
306
307 /*
308 * Copies all of an Allocation's data into an array.
309 *
310 * All Vec3 elements of an Allocation are padded to be Vec4, so the data
311 * returned by this function automatically includes padding.
312 *
313 * HIDL is always running in Passthrough mode for RenderScript, so the
314 * buffer is modified directly by the driver.
315 *
316 * @param allocation Allocation to be read
317 * @param data Buffer to be copied into
318 * @param sizeBytes Size of the buffer pointed to by "data"
319 */
320 @callflow(next={"*"})
321 allocationRead(Allocation allocation, Ptr data, Size sizeBytes);
322
323 /*
324 * Copies a 1D region of this Allocation into an array.
325 *
326 * All Vec3 elements of an Allocation are padded to be Vec4, so the data
327 * returned by this function automatically includes padding.
328 *
329 * The size of the region is: count * Element's size.
330 *
331 * HIDL is always running in Passthrough mode for RenderScript, so the
332 * buffer is modified directly by the driver.
333 *
334 * @param allocation Allocation to be read
335 * @param xoff X offset of the first element to be copied
336 * @param lod Mipmap level of detail
337 * @param count The number of elements to be copied
338 * @param data Buffer to be copied into
339 * @param sizeBytes Size of the buffer pointed to by "data"
340 */
341 @callflow(next={"*"})
342 allocation1DRead(Allocation allocation, uint32_t xoff, uint32_t lod,
343 uint32_t count, Ptr data, Size sizeBytes);
344
345 /*
346 * Returns the value of a single sub-Element of this Allocation.
347 *
348 * HIDL is always running in Passthrough mode for RenderScript, so the
349 * buffer is modified directly by the driver.
350 *
351 * @param allocation Allocation to be read
352 * @param x X position of the first element in the Allocation to be read
353 * @param y Y position of the first element in the Allocation to be read
354 * @param z Z position of the first element in the Allocation to be read
355 * @param lod Mipmap level of detail
356 * @param data Buffer to be copied into
357 * @param sizeBytes Size of the buffer pointed to by "data"
358 * @param compIdx Component number to identify which sub-Element is updated
359 */
360 @callflow(next={"*"})
361 allocationElementRead(Allocation allocation, uint32_t x, uint32_t y,
362 uint32_t z, uint32_t lod, Ptr data, Size sizeBytes,
363 Size compIdx);
364
365 /*
366 * Copies from a rectangular region in this Allocation to an array.
367 *
368 * All Vec3 elements of an Allocation are padded to be Vec4, so the data
369 * returned by this function automatically includes padding.
370 *
371 * The size of the region is: w * h * Element's size.
372 *
373 * HIDL is always running in Passthrough mode for RenderScript, so the
374 * buffer is modified directly by the driver.
375 *
376 * @param allocation Allocation to be read
377 * @param xoff X offset of the region to copy in this array
378 * @param yoff Y offset of the region to copy in this array
379 * @param lod Mipmap level of detail
380 * @param face AllocationCubemapFace
381 * @param w Width of the region to copy
382 * @param h Height of the region to copy
383 * @param data Buffer to be copied into
384 * @param sizeBytes Size of the buffer pointed to by "data"
385 * @param stride For 1D Allocation, the stride must be the number of bytes
386 * of this Allocation. For 2D and 3D Allocations, the stride
387 * must be the stride in X dimension measuring in bytes.
388 */
389 @callflow(next={"*"})
390 allocation2DRead(Allocation allocation, uint32_t xoff, uint32_t yoff,
391 uint32_t lod, AllocationCubemapFace face, uint32_t w,
392 uint32_t h, Ptr data, Size sizeBytes, Size stride);
393
394 /*
395 * Copies from a rectangular cuboid region in this Allocation to an array.
396 *
397 * All Vec3 elements of an Allocation are padded to be Vec4, so the data
398 * returned by this function automatically includes padding.
399 *
400 * The size of the region is: w * h * d * Element's size.
401 *
402 * HIDL is always running in Passthrough mode for RenderScript, so the
403 * buffer is modified directly by the driver.
404 *
405 * @param allocation Allocation to be read
406 * @param xoff X offset of the region to copy in this array
407 * @param yoff Y offset of the region to copy in this array
408 * @param zoff Z offset of the region to copy in this array
409 * @param lod Mipmap level of detail
410 * @param w Width of the region to copy
411 * @param h Height of the region to copy
412 * @param d Depth of the region to copy
413 * @param data Buffer to be copied into
414 * @param sizeBytes Size of the buffer pointed to by "data"
415 * @param stride For 1D Allocation, the stride must be the number of bytes
416 * of this Allocation. For 2D and 3D Allocations, the stride
417 * must be the stride in X dimension measuring in bytes.
418 */
419 @callflow(next={"*"})
420 allocation3DRead(Allocation allocation, uint32_t xoff, uint32_t yoff,
421 uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h,
422 uint32_t d, Ptr data, Size sizeBytes, Size stride);
423
424 /*
425 * Propagates changes from one usage of the Allocation to the other usages
426 * of the Allocation.
427 *
428 * @param allocation First usage of the Allocation
429 * @param usageType Allocation usage type
430 */
431 @callflow(next={"*"})
432 allocationSyncAll(Allocation allocation, AllocationUsageType usageType);
433
434 /*
435 * TODO: describe the functionality of resize1D better
436 * TODO: original Java Doc description seems to contradict itself ("with
437 * null contents and the region is otherwise undefined")
438 * TODO: should "new elements" be "new cells"?
439 * TODO: what does "objects are created" mean?
440 * TODO: what does "new dimension" mean? IS the type of the resized
441 * allocation different than the type before resizing?
442 *
443 * Resizes a 1D allocation. The contents of the allocation are preserved.
444 * If new elements are allocated, objects are created with null contents
445 * and the new region is otherwise undefined.
446 *
447 * If the new region is smaller, the references of any object outside the
448 * new region must be released.
449 *
450 * A new type must be created with the new dimension.
451 *
452 * @param allocation Allocation to be resized
453 * @param dimX New size along the x dimension of the Allocation
454 */
455 @callflow(next={"*"})
456 allocationResize1D(Allocation allocation, uint32_t dimX);
457
458 /*
459 * TODO: There are allocationCopy2DRange and 3DRange, but no 1DRange. Should
460 * the interface be cleaned up more?
461 *
462 * Copies a rectangular region from an Allocation into a rectangular region
463 * in this Allocation.
464 *
465 * @param dstAlloc Allocation to be updated
466 * @param dstXoff X offset of the region to update
467 * @param dstYoff Y offset of the region to update
468 * @param dstMip Selected mipmap level of the Allocation to update
469 * @param dstFace Destination AllocationCubemapFace
470 * @param width Width of the region to update
471 * @param height Height of the region to update
472 * @param srcAlloc Source Allocation, to be read
473 * @param srcXoff X offset of the region in the source Allocation
474 * @param srcYoff Y offset of the region in the source Allocation
475 * @param srcMip Selected mipmap level of the source Allocation
476 * @param srcFace Source AllocationCubemapFace
477 */
478 @callflow(next={"*"})
479 allocationCopy2DRange(Allocation dstAlloc, uint32_t dstXoff,
480 uint32_t dstYoff, uint32_t dstMip,
481 AllocationCubemapFace dstFace, uint32_t width,
482 uint32_t height, Allocation srcAlloc,
483 uint32_t srcXoff, uint32_t srcYoff, uint32_t srcMip,
484 AllocationCubemapFace srcFace);
485
486 /*
487 * Copies a rectangular cuboid region into the allocation from another
488 * Allocation.
489 *
490 * @param dstAlloc Allocation to be updated
491 * @param dstXoff X offset of the region to update
492 * @param dstYoff Y offset of the region to update
493 * @param dstZoff Z offset of the region to update
494 * @param dstMip Selected mipmap level of the Allocation to update
495 * @param width Width of the region to update
496 * @param height Height of the region to update
497 * @param depth Depth of the region to update
498 * @param srcAlloc Source Allocation, to be read
499 * @param srcXoff Source X offset of the region in the source Allocation
500 * @param srcYoff Source Y offset of the region in the source Allocation
501 * @param srcZoff Source Z offset of the region in the souce Allocation
502 * @param srcMip Selected mipmap level of the Allocation to read
503 */
504 @callflow(next={"*"})
505 allocationCopy3DRange(Allocation dstAlloc, uint32_t dstXoff,
506 uint32_t dstYoff, uint32_t dstZoff, uint32_t dstMip,
507 uint32_t width, uint32_t height, uint32_t depth,
508 Allocation srcAlloc, uint32_t srcXoff,
509 uint32_t srcYoff, uint32_t srcZoff, uint32_t srcMip);
510
511 /*
512 * TODO: define buffer and output stream
513 *
514 * Sends a buffer to the output stream. The contents of the Allocation may
515 * be undefined after this operation. This operation is only valid if
516 * USAGE_IO_OUTPUT is set on the Allocation.
517 *
518 * @param allocation Allocation to be sent
519 */
520 @callflow(next={"*"})
521 allocationIoSend(Allocation allocation);
522
523 /*
524 * Receives the latest input into the Allocation. This operation is only
525 * valid if USAGE_IO_INPUT is set on the Allocation, otherwise an error
526 * must be reported and no operations may be executed.
527 *
528 * @param allocation Allocation to be updated
529 */
530 @callflow(next={"*"})
531 allocationIoReceive(Allocation allocation);
532
533 /*
534 * TODO: describe default values for lod, face, and z better.
535 * TODO: what cases can invalidate the pointer? Resize? It should be
536 * clarified that this method should always return a valid pointer, but the
537 * returned pointer might become invalid later.
538 *
539 * Retrieves the pointer to the actual data an Allocation contains as well
540 * as the data's stride.
541 *
542 * If Allocation lacks the corresponding dimension for lod, face, or z, an
543 * error message must be sent to the message queue and nullptr must be
544 * returned for dataPtr and 0 for stride. All missing values must be 0 or
545 * NONE in the corresponding enum.
546 *
547 * @param allocation Allocation
548 * @param lod Mipmap level of detail
549 * @param face AllocationCubemapFace
550 * @param z Z position
551 * @return pointer Pointer to the server-side data; if this points to an
552 * invalid location in memory (because the buffer was
553 * freed), this may result in undefined behavior
554 * @return stride For 1D Allocation, the stride must be the number of bytes
555 * of this Allocation. For 2D and 3D Allocations, the stride
556 * must be the stride in X dimension measuring in bytes.
557 */
558 @callflow(next={"*"})
559 allocationGetPointer(Allocation allocation, uint32_t lod,
560 AllocationCubemapFace face, uint32_t z)
561 generates (Ptr dataPtr, Size stride);
562
563 /*
564 * Retrieves an Element's metadata from native code.
565 *
566 * @param element Element to be read
567 * @return elemData Element data
568 */
569 @callflow(next={"*"})
570 elementGetNativeMetadata(Element element)
571 generates (vec<uint32_t> elemData);
572
573 /*
574 * TODO: define Sub-Element handles better.
575 *
576 * Retrieves an Element's sub Elements, specifically their identifiers,
577 * names, and sizes.
578 *
579 * @param element Element to be read
580 * @param numSubElem Number of sub-Elements
581 * @return ids Sub-Element handles
582 * @return names Sub-Element Names
583 * @return arraySizes Sizes of sub-Element arrays
584 */
585 @callflow(next={"*"})
586 elementGetSubElements(Element element, Size numSubElem)
587 generates (vec<Element> ids, vec<string> names,
588 vec<Size> arraySizes);
589
590 /*
591 * TODO: can normalization flag be removed?
592 *
593 * Creates an Element.
594 *
595 * @param dt Data type
596 * @param dk Data kind
597 * @param norm Flag for normalization
598 * @param size Vector length, with scalar = 1
599 * @return element Created Element
600 */
601 @callflow(next={"*"})
602 elementCreate(DataType dt, DataKind dk, bool norm, uint32_t size)
603 generates (Element element);
604
605 /*
606 * Creates a complex Element.
607 *
608 * @param einsPtr Container of input Elements
609 * @param namesPtr Container of input names
610 * @param arraySizesPtr Container of array sizes
611 * @return element Created Element
612 */
613 @callflow(next={"*"})
614 elementComplexCreate(vec<Element> einsPtr, vec<string> names,
615 vec<Size> arraySizesPtr)
616 generates (Element element);
617
618 /*
619 * Retrives a Type's metadata from native code.
620 *
621 * @param type Type describing data layout
622 * @return metadata Type's native metadata
623 */
624 @callflow(next={"*"})
625 typeGetNativeMetadata(Type type) generates (vec<OpaqueHandle> metadata);
626
627 /*
628 * Creates a new Type.
629 *
630 * If Type is 1D, Y and Z must be 0. If Type is 2D, Z must be 0.
631 *
632 * @param element Element of the Type
633 * @param dimX X dimension
634 * @param dimY Y dimension
635 * @param dimZ Z dimension
636 * @param mipmaps Flag indicating whether Type has mipmaps
637 * @param faces Flag indicating whether Type has faces
638 * @param yuv Enumeration specifying which type of YUV format, if any, Type
639 * uses
640 * @return type Created Type
641 */
642 @callflow(next={"*"})
643 typeCreate(Element element, uint32_t dimX, uint32_t dimY, uint32_t dimZ,
644 bool mipmaps, bool faces, YuvFormat yuv)
645 generates (Type type);
646
647 /*
648 * Destroys provided RenderScript context, including all objects created in
649 * this context.
650 */
651 @exit
652 contextDestroy();
653
654 /*
655 * TODO: provide overview of messaging model and figure out if this should
656 * be part of HAL or not.
657 * TODO: what is the "client" for purposes of this interface?
658 * TODO: consider using send/receive to be more similar to other calls
659 * TODO: define the purpose of size more
660 *
661 * Fills the provided buffer with message data. "size" should be at least
662 * as large as the message size. Returns the MessageType and size of the
663 * message are returned.
664 *
665 * @param data A pointer to a buffer to be filled with a message
666 * @param size Size in bytes of the buffer pointed to by "data"
667 * @return messageType Type of message sent to the client
668 * @return receiveLen Length of the message in bytes
669 */
670 @callflow(next={"*"})
671 contextGetMessage(Ptr data, Size size)
672 generates (MessageToClientType messageType, Size receiveLen);
673
674 /*
675 * TODO: define subID better.
676 *
677 * Gets the metadata of a message to ensure entire message can be properly
678 * received. Can be used to determine size of data to allocate when calling
679 * contextGetMessage.
680 *
681 * @return messageType Type of message sent to the client
682 * @return receiveLen Length of message
683 * @return subID Message sub identifier
684 */
685 @callflow(next={"*"})
686 contextPeekMessage()
687 generates (MessageToClientType messageType, Size receiveLen,
688 uint32_t subID);
689
690 /*
691 * TODO: Define "previous commands" better
692 * TODO: Is the message identifier the same as subID?
693 *
694 * Places a message into the message queue to be sent back to the message
695 * handler once all previous commands have been executed. The message data
696 * is copied into the queue and can be discarded by the client after this
697 * call.
698 *
699 * @param id Message identifier
700 * @param data Message data
701 */
702 @callflow(next={"*"})
703 contextSendMessage(uint32_t id, vec<uint8_t> data);
704
705 /*
706 * TODO: Can this be done automatically as part of context creation? What
707 * happens if we perform message operations before doing this?
708 *
709 * Initializes the messaging thread, so that the front-end API can receive
710 * messages from the driver. This call also waits for the messaging FIFO to
711 * start up.
712 */
713 @callflow(next={"*"})
714 contextInitToClient();
715
716 /*
717 * TODO: Why doesn't this happen automatically as part of context
718 * destruction? What happens if the FIFO is not empty?
719 *
720 * Deinitializes a the messaging thread. Shuts down the FIFO.
721 */
722 @callflow(next={"*"})
723 contextDeinitToClient();
724
725 /*
726 * TODO: do we need to mark asynchronous operations in this interface
727 * definition?
728 *
729 * Waits for any pending asynchronous operations (such as copies to a RS
730 * allocation or RS script executions) to complete.
731 */
732 @callflow(next={"*"})
733 contextFinish();
734
735 /*
736 * Prints the currently available debugging information about the state of
737 * the RS context to the logcat.
738 */
739 @callflow(next={"*"})
740 contextLog();
741
742 /*
743 * TODO: full path? relative path? Investigate further.
744 *
745 * Sets the cache directory of the context.
746 *
747 * @param cacheDir Name of the application's cache directory
748 */
749 @callflow(next={"*"})
750 contextSetCacheDir(string cacheDir);
751
752 /*
753 * TODO: does this apply to the GPU as well?
754 *
755 * Changes the priority of the cpu worker threads for this context.
756 *
757 * @param priority Priority of the thread
758 */
759 @callflow(next={"*"})
760 contextSetPriority(ThreadPriorities priority);
761
762 /*
763 * TODO: does this need to be part of the HAL? What if the object already
764 * has a name?
765 *
766 * Assigns a name to a base object.
767 *
768 * @param obj Object to be named
769 * @param name Assigned name
770 */
771 @callflow(next={"*"})
772 assignName(ObjectBase obj, string name);
773
774 /*
775 * TODO: what if the object has no name?
776 *
777 * Returns the name of an object.
778 *
779 * @param obj Object to be read
780 * @return name Name of the object
781 */
782 @callflow(next={"*"})
783 getName(ObjectBase obj) generates (string name);
784
785 /*
786 * TODO: starting here we have a set of interfaces for use with
787 * ScriptGroups. At the very least we should indicate for each one that's
788 * what it's for. Should we include ScriptGroup in the interface names?
789 * TODO: sweep whole file and remove prefix "v" from all parameter names
790 * TODO: there are some places where we use Size for size, and others where
791 * we use int32_t. Is there a reason it's int32_t? In some cases, it
792 * requires a negative value.
793 *
794 * Creates a Closure which represents a function call to a ForEach Kernel
795 * combined with arguments and values for global variables.
796 *
797 * @param kernelID Kernel identifier
798 * @param returnValue Allocation used in output of Closure
799 * @param fieldIDS Collection of Script's Field identifiers
800 * @param values Collection of Script's data values
801 * @param sizes Collection of Script's data sizes
802 * @param depClosures Collection of Closures
803 * @param depFieldIDS Collection of Script's dependent Field identifiers
804 * @return closure Created Closure
805 */
806 @callflow(next={"*"})
807 closureCreate(ScriptKernelID kernelID, Allocation returnValue,
808 vec<ScriptFieldID> fieldIDS, vec<int64_t> values,
809 vec<int32_t> sizes, vec<Closure> depClosures,
810 vec<ScriptFieldID> depFieldIDS)
811 generates (Closure closure);
812
813 /*
814 * Creates a Closure which represents a function call to a invocable
815 * function, combined with arguments and values for global variables.
816 *
817 * @param invokeID Invokable function identifier
818 * @param params Collection of Invoke script parameters
819 * @param fieldIDS Collection of Script Field identifiers
820 * @param values Collection of values
821 * @param sizes Collection of sizes
822 * @return closure Created Closure
823 */
824 @callflow(next={"*"})
825 invokeClosureCreate(ScriptInvokeID invokeID, vec<uint8_t> params,
826 vec<ScriptFieldID> fieldIDS, vec<int64_t> values,
827 vec<int32_t> sizes)
828 generates (Closure closure);
829
830 /*
831 * Sets the argument of a Closure at specified index and size to provided
832 * value.
833 *
834 * @param closure Closure to be modified
835 * @param index Index
836 * @param value Value
837 * @param size Size
838 */
839 @callflow(next={"*"})
840 closureSetArg(Closure closure, uint32_t index, Ptr value, int32_t size);
841
842 /*
843 * Sets a global variable in a Closure.
844 *
845 * @param closure Closure
846 * @param fieldID Global's Field identifier
847 * @param value Value
848 * @param size Size
849 */
850 @callflow(next={"*"})
851 closureSetGlobal(Closure closure, ScriptFieldID fieldID, int64_t value,
852 int32_t size);
853
854 /*
855 * TODO: should slot be unsigned? (applies to other two ID interfaces, too)
856 *
857 * Creates a Script Kernel ID.
858 *
859 * @param script Script
860 * @param slot Slot
861 * @param sig Bitfield describing Kernel signature and operation
862 * @return scriptKernelID Script's Kernel identifier
863 */
864 @callflow(next={"*"})
865 scriptKernelIDCreate(Script script, int32_t slot,
866 bitfield<MetadataSignatureBitval> sig)
867 generates (ScriptKernelID scriptKernelID);
868
869 /*
870 * Creates a Script Invoke ID.
871 *
872 * @param script Script
873 * @param slot Slot
874 * @return scriptInvokeID Invoke Script's identifier
875 */
876 @callflow(next={"*"})
877 scriptInvokeIDCreate(Script script, int32_t slot)
878 generates (ScriptInvokeID scriptInvokeID);
879
880 /*
881 * TODO: describe the return value better. What is it?
882 *
883 * Creates a Script Field ID.
884 *
885 * @param script Script
886 * @param slot Slot
887 * @return scriptFieldID Script's Field identifier
888 */
889 @callflow(next={"*"})
890 scriptFieldIDCreate(Script script, int32_t slot)
891 generates (ScriptFieldID scriptFieldID);
892
893 /*
894 * TODO: add more description
895 *
896 * Creates a Script Group.
897 *
898 * @param kernels Collection of Scripts' Kernel identifiers
899 * @param srcK Source Kernel identifiers
900 * @param dstK Destination Kernel identifiers
901 * @param dstF Destination Script Field identifiers
902 * @param types Collection of Types describing data layout
903 * @return scriptGroup Created Script Group
904 */
905 @callflow(next={"*"})
906 scriptGroupCreate(vec<ScriptKernelID> kernels, vec<ScriptKernelID> srcK,
907 vec<ScriptKernelID> dstK, vec<ScriptFieldID> dstF,
908 vec<Type> types)
909 generates (ScriptGroup scriptGroup);
910
911 /*
912 * Creates a Script Group.
913 *
914 * @param name Name
915 * @param cacheDir Cache directory
916 * @param closures Collection of Closures
917 * @return scriptGroup2 Created Script Group
918 */
919 @callflow(next={"*"})
920 scriptGroup2Create(string name, string cacheDir, vec<Closure> closures)
921 generates (ScriptGroup2 scriptGroup2);
922
923 /*
924 * TODO: if SetInput/Output corresponds to the Java API setInput() and
925 * setOutput(), which are documented as deprecated in API 23, do we need to
926 * support them? Or can we fallback to the CPU when they're used? Or can't
927 * we tell whether they're used early enough to do fallback?
928 *
929 * Sets an output of the ScriptGroup. This specifies an Allocation to be
930 * used for the kernels that require an output Allocation visible after the
931 * ScriptGroup is executed.
932 *
933 * @param sg Script Group
934 * @param kid Script's Kernel identifier to be changed
935 * @param alloc Allocation to be filled by output
936 */
937 @callflow(next={"*"})
938 scriptGroupSetOutput(ScriptGroup sg, ScriptKernelID kid, Allocation alloc);
939
940 /*
941 * Sets an input of the Script Group. This specifies an Allocation to be
942 * used for kernels that require an input Allocation provided from outside
943 * of the Script Group.
944 *
945 * @param sg Script Group
946 * @param kid Script's Kernel identifier to be changed
947 * @param alloc Allocation to be read as input
948 */
949 @callflow(next={"*"})
950 scriptGroupSetInput(ScriptGroup sg, ScriptKernelID kid, Allocation alloc);
951
952 /*
953 * Executes a Script Group.
954 *
955 * @param sg Script Group to be executed.
956 */
957 @callflow(next={"*"})
958 scriptGroupExecute( ScriptGroup sg);
959
960 /*
961 * Frees any native resources associated with this object. The primary use
962 * is to force immediate cleanup of resources when it is believed the GC
963 * may not respond quickly enough.
964 *
965 * @param handle Opaque handle to the server-side object to be destroyed
966 */
967 @callflow(next={"*"})
968 objDestroy(ObjectBase obj);
969
970 /*
971 * Creates a Sampler.
972 *
973 * @param magFilter Magnification value for the filter
974 * @param minFilter Minification value for the filter
975 * @param wrapS S wrapping mode for the sampler
976 * @param wrapT T wrapping mode for the sampler
977 * @param wrapR R wrapping mode for the sampler
978 * @param aniso Anisotropy setting for the sampler
979 * @return sampler Created Sampler
980 */
981 @callflow(next={"*"})
982 samplerCreate(SamplerValue magFilter, SamplerValue minFilter,
983 SamplerValue wrapS, SamplerValue wrapT, SamplerValue wrapR,
984 float aniso)
985 generates (Sampler sampler);
986
987 /*
988 * Binds an Allocation to a global pointer in the Script.
989 *
990 * @param script Script to be bound to
991 * @param allocation Allocation to be bound
992 * @param slot Slot of a global variable
993 */
994 @callflow(next={"*"})
995 scriptBindAllocation(Script script, Allocation allocation, uint32_t slot);
996
997 /*
998 * TODO: is this necessary?
999 *
1000 * Sets the timezone of a Script.
1001 *
1002 * @param script Script to be altered
1003 * @param timeZone Time Zone value as text
1004 */
1005 @callflow(next={"*"})
1006 scriptSetTimeZone(Script script, string timeZone);
1007
1008 /*
1009 * TODO: can scriptInvoke be combined with scriptInvokeV?
1010 *
1011 * Launches an invokable function.
1012 *
1013 * @param vs Script to be invoked
1014 * @param slot Slot of invokable function
1015 */
1016 @callflow(next={"*"})
1017 scriptInvoke(Script vs, uint32_t slot);
1018
1019 /*
1020 * Invokes a Script with values.
1021 *
1022 * @param vs Script to be invoked
1023 * @param slot Slot
1024 * @param data Data buffer of packed arguments
1025 */
1026 @callflow(next={"*"})
1027 scriptInvokeV(Script vs, uint32_t slot, vec<uint8_t> data);
1028
1029 /*
1030 * TODO: add documentation for params
1031 * TODO: Should we rename "ScriptCall" to "LaunchOptions"?
1032 *
1033 * Launches a ForEach kernel.
1034 *
1035 * @param vs Script
1036 * @param slot Slot of ForEach Kernel
1037 * @param vains Collection of input Allocations or null
1038 * @param vaout Output Allocation or null
1039 * @param params Collection of parameters
1040 * @param sc Pointer to a ScriptCall, nullptr if unused
1041 */
1042 @callflow(next={"*"})
1043 scriptForEach(Script vs, uint32_t slot, vec<Allocation> vains,
1044 Allocation vaout, vec<uint8_t> params, Ptr sc);
1045
1046 /*
1047 * Launches a Reduction kernel.
1048 *
1049 * @param vs Script
1050 * @param slot Slot of Reduction Kernel
1051 * @param vains Collection of input Allocations
1052 * @param vaout Output Allocation
1053 * @param sc Pointer to a ScriptCall, nullptr if unused
1054 */
1055 @callflow(next={"*"})
1056 scriptReduce(Script vs, uint32_t slot, vec<Allocation> vains,
1057 Allocation vaout, Ptr sc);
1058
1059 /*
1060 * Sets a Script's integer variable to a value.
1061 *
1062 * @param vs RenderScript Script
1063 * @param slot Slot number of variable to be updated
1064 * @param value Value to be pushed to variable
1065 */
1066 @callflow(next={"*"})
1067 scriptSetVarI(Script vs, uint32_t slot, int32_t value);
1068
1069 /*
1070 * Sets a Script's Object variable to a value
1071 *
1072 * @param vs RenderScript Script
1073 * @param slot Slot number of variable to be updated
1074 * @param obj ObjectBase
1075 */
1076 @callflow(next={"*"})
1077 scriptSetVarObj( Script vs, uint32_t slot, ObjectBase obj);
1078
1079 /*
1080 * Sets a Script's long variable to a value.
1081 *
1082 * @param vs RenderScript Script
1083 * @param slot Slot number of variable to be updated
1084 * @param value Value to be pushed to variable
1085 */
1086 @callflow(next={"*"})
1087 scriptSetVarJ(Script vs, uint32_t slot, int64_t value);
1088
1089 /*
1090 * Sets a Script's float variable to a value.
1091 *
1092 * @param vs RenderScript Script
1093 * @param slot Slot number of variable to be updated
1094 * @param value Value to be pushed to variable
1095 */
1096 @callflow(next={"*"})
1097 scriptSetVarF(Script vs, uint32_t slot, float value);
1098
1099 /*
1100 * Sets a Script's double variable to a value.
1101 *
1102 * @param vs RenderScript Script
1103 * @param slot Slot number of variable to be updated
1104 * @param value Value to be pushed to variable
1105 */
1106 @callflow(next={"*"})
1107 scriptSetVarD(Script vs, uint32_t slot, double value);
1108
1109 /*
1110 * Sets a Script's struct variable to a value.
1111 *
1112 * @param vs RenderScript Script
1113 * @param slot Slot number of variable to be updated
1114 * @param data Data to be pushed to variable
1115 */
1116 @callflow(next={"*"})
1117 scriptSetVarV(Script vs, uint32_t slot, vec<uint8_t> data);
1118
1119 /*
1120 * TODO: Why do we have typed setters but only untyped getter?
1121 *
1122 * Retrieves the value from a global variable in a script.
1123 *
1124 * @param vs RenderScript Script
1125 * @param slot Slot number of variable to be read
1126 * @param len Size of data to be filled
1127 * @return data Data to be updated
1128 */
1129 @callflow(next={"*"})
1130 scriptGetVarV(Script vs, uint32_t slot, Size len)
1131 generates (vec<uint8_t> data);
1132
1133 /*
1134 * TODO: Is this a value to be replicated for each member of the array? Or
1135 * is there a representation for each separate member?
1136 *
1137 * Sets the value of a global array of structs, given the Element and
1138 * dimension.
1139 *
1140 * @param vs RenderScript Script
1141 * @param slot Slot number of variable to be updated
1142 * @param data Data
1143 * @param ve Element
1144 * @param dims Collection of dimensions
1145 */
1146 @callflow(next={"*"})
1147 scriptSetVarVE(Script vs, uint32_t slot, vec<uint8_t> data, Element ve,
1148 vec<uint32_t> dims);
1149
1150 /*
1151 * TODO: is cacheDir redundant with createCache() function? Can we remove
1152 * it?
1153 * TODO: define resName more clearly
1154 *
1155 * Creates a RenderScript C99 kernel script.
1156 *
1157 * @param resName Resource name of the bitcode
1158 * @param cacheDir Cache directory name
1159 * @param text The kernel's bitcode as a uint8_t vector
1160 * @return script Created Script
1161 */
1162 @callflow(next={"*"})
1163 scriptCCreate(string resName, string cacheDir, vec<uint8_t> text)
1164 generates (Script script);
1165
1166 /*
1167 * Creates a RenderScript Intrinsic script.
1168 *
1169 * @param id Intrinsic Script identifier
1170 * @param elem Element
1171 * @return script Created Script
1172 */
1173 @callflow(next={"*"})
1174 scriptIntrinsicCreate(ScriptIntrinsicID id, Element elem)
1175 generates (Script script);
1176
1177};