1 /*
2  * Copyright (C) 2011-2012 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 
17 #ifndef RS_HAL_H
18 #define RS_HAL_H
19 
20 #include <rsInternalDefines.h>
21 
22 /*
23  * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
24  * !! Major version number of the driver.  This is used to ensure that
25  * !! the driver (e.g., libRSDriver) is compatible with the shell
26  * !! (i.e., libRS_internal) responsible for loading the driver.
27  * !! There is no notion of backwards compatibility -- the driver and
28  * !! the shell must agree on the major version number.
29  * !!
30  * !! The version number must change whenever there is a semantic change
31  * !! to the HAL such as adding or removing an entry point or changing
32  * !! the meaning of an entry point.  By convention it is monotonically
33  * !! increasing across all branches (e.g., aosp/master and all internal
34  * !! branches).
35  * !!
36  * !! Be very careful when merging or cherry picking between branches!
37  * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
38  */
39 #define RS_HAL_VERSION 200
40 
41 /**
42  * The interface for loading RenderScript drivers
43  *
44  * The startup sequence is
45  *
46  * 1: dlopen driver
47  * 2: Query driver version with rsdHalQueryVersion() and verify
48  *    that the driver (e.g., libRSDriver) is compatible with the shell
49  *    (i.e., libRS_internal) responsible for loading the driver
50  * 3: Fill in HAL pointer table with calls to rsdHalQueryHAL()
51  * 4: Initialize the context with rsdHalInit()
52  *
53  * If any of these functions return false, the loading of the
54  * driver will abort and the reference driver will be used.
55  * rsdHalAbort() will be called to clean up any partially
56  * allocated state.
57  *
58  * A driver should return FALSE for any conditions that will
59  * prevent the driver from working normally.
60  *
61  *
62  * If these are successful, the driver will be loaded and used
63  * normally.  Teardown will use the normal
64  * context->mHal.funcs.shutdown() path.  There will be no call
65  * to rsdHalAbort().
66  *
67  *
68  */
69 
70 
71 struct ANativeWindow;
72 
73 namespace android {
74 namespace renderscript {
75 
76 class Context;
77 class ObjectBase;
78 class Element;
79 class Type;
80 class Allocation;
81 class Script;
82 class ScriptKernelID;
83 class ScriptFieldID;
84 class ScriptMethodID;
85 class ScriptC;
86 class ScriptGroup;
87 class ScriptGroupBase;
88 class Path;
89 class Program;
90 class ProgramStore;
91 class ProgramRaster;
92 class ProgramVertex;
93 class ProgramFragment;
94 class Mesh;
95 class Sampler;
96 class FBOCache;
97 
98 /**
99  * Define the internal object types.  This ia a mirror of the
100  * definition in rs_types.rsh except with the p value typed
101  * correctly.
102  *
103  * p = pointer to internal object implementation
104  * unused1, unused2, unused3 = reserved for ABI compatibility
105  */
106 
107 // RS_BASE_OBJ must have the same layout as _RS_OBJECT_DECL defined in
108 // script_api/rs_object_types.spec.
109 // TODO(jeanluc) Look at unifying.
110 #ifndef __LP64__
111 #define RS_BASE_OBJ(_t_) typedef struct { const _t_* p; } __attribute__((packed, aligned(4)))
112 #define RS_BASE_NULL_OBJ {0}
113 #else
114 #define RS_BASE_OBJ(_t_) typedef struct { const _t_* p; const void* unused1; const void* unused2; const void* unused3; }
115 #define RS_BASE_NULL_OBJ {0, 0, 0, 0}
116 #endif
117 
118 RS_BASE_OBJ(ObjectBase) rs_object_base;
119 RS_BASE_OBJ(Element) rs_element;
120 RS_BASE_OBJ(Type) rs_type;
121 RS_BASE_OBJ(Allocation) rs_allocation;
122 RS_BASE_OBJ(Sampler) rs_sampler;
123 RS_BASE_OBJ(Script) rs_script;
124 RS_BASE_OBJ(ScriptGroup) rs_script_group;
125 
126 #ifndef __LP64__
127 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_mesh;
128 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_fragment;
129 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_vertex;
130 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_raster;
131 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_store;
132 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_font;
133 #endif // __LP64__
134 
135 
136 typedef void *(*RsHalSymbolLookupFunc)(void *usrptr, char const *symbolName);
137 
138 /**
139  * Script management functions
140  */
141 typedef struct {
142     int (*initGraphics)(const Context *);
143     void (*shutdownGraphics)(const Context *);
144     bool (*setSurface)(const Context *, uint32_t w, uint32_t h, RsNativeWindow);
145     void (*swap)(const Context *);
146 
147     void (*shutdownDriver)(Context *);
148     void (*setPriority)(const Context *, int32_t priority);
149 
150     void* (*allocRuntimeMem)(size_t size, uint32_t flags);
151     void (*freeRuntimeMem)(void* ptr);
152 
153     struct {
154         bool (*init)(const Context *rsc, ScriptC *s,
155                      char const *resName,
156                      char const *cacheDir,
157                      uint8_t const *bitcode,
158                      size_t bitcodeSize,
159                      uint32_t flags);
160         bool (*initIntrinsic)(const Context *rsc, Script *s,
161                               RsScriptIntrinsicID iid,
162                               Element *e);
163 
164         void (*invokeFunction)(const Context *rsc, Script *s,
165                                uint32_t slot,
166                                const void *params,
167                                size_t paramLength);
168         int (*invokeRoot)(const Context *rsc, Script *s);
169         void (*invokeForEach)(const Context *rsc,
170                               Script *s,
171                               uint32_t slot,
172                               const Allocation * ain,
173                               Allocation * aout,
174                               const void * usr,
175                               size_t usrLen,
176                               const RsScriptCall *sc);
177         void (*invokeReduce)(const Context *rsc, Script *s,
178                              uint32_t slot,
179                              const Allocation ** ains, size_t inLen,
180                              Allocation *aout,
181                              const RsScriptCall *sc);
182         void (*invokeInit)(const Context *rsc, Script *s);
183         void (*invokeFreeChildren)(const Context *rsc, Script *s);
184 
185         void (*setGlobalVar)(const Context *rsc, const Script *s,
186                              uint32_t slot,
187                              void *data,
188                              size_t dataLength);
189         void (*getGlobalVar)(const Context *rsc, const Script *s,
190                              uint32_t slot,
191                              void *data,
192                              size_t dataLength);
193         void (*setGlobalVarWithElemDims)(const Context *rsc, const Script *s,
194                                          uint32_t slot,
195                                          void *data,
196                                          size_t dataLength,
197                                          const Element *e,
198                                          const uint32_t *dims,
199                                          size_t dimLength);
200         void (*setGlobalBind)(const Context *rsc, const Script *s,
201                               uint32_t slot,
202                               Allocation *data);
203         void (*setGlobalObj)(const Context *rsc, const Script *s,
204                              uint32_t slot,
205                              ObjectBase *data);
206 
207         void (*destroy)(const Context *rsc, Script *s);
208         void (*invokeForEachMulti)(const Context *rsc,
209                                    Script *s,
210                                    uint32_t slot,
211                                    const Allocation ** ains,
212                                    size_t inLen,
213                                    Allocation * aout,
214                                    const void * usr,
215                                    size_t usrLen,
216                                    const RsScriptCall *sc);
217         void (*updateCachedObject)(const Context *rsc, const Script *, rs_script *obj);
218     } script;
219 
220     struct {
221         bool (*init)(const Context *rsc, Allocation *alloc, bool forceZero);
222         bool (*initOem)(const Context *rsc, Allocation *alloc, bool forceZero, void *usrPtr);
223         bool (*initAdapter)(const Context *rsc, Allocation *alloc);
224         void (*destroy)(const Context *rsc, Allocation *alloc);
225         uint32_t (*grallocBits)(const Context *rsc, Allocation *alloc);
226 
227         void (*resize)(const Context *rsc, const Allocation *alloc, const Type *newType,
228                        bool zeroNew);
229         void (*syncAll)(const Context *rsc, const Allocation *alloc, RsAllocationUsageType src);
230         void (*markDirty)(const Context *rsc, const Allocation *alloc);
231 
232         void (*setSurface)(const Context *rsc, Allocation *alloc, ANativeWindow *sur);
233         void (*ioSend)(const Context *rsc, Allocation *alloc);
234 
235         /**
236          * A new gralloc buffer is in use. The pointers and strides in
237          * mHal.drvState.lod[0-2] will be updated with the new values.
238          *
239          * The new gralloc handle is provided in mHal.state.nativeBuffer
240          *
241          */
242         void (*ioReceive)(const Context *rsc, Allocation *alloc);
243 
244         void (*data1D)(const Context *rsc, const Allocation *alloc,
245                        uint32_t xoff, uint32_t lod, size_t count,
246                        const void *data, size_t sizeBytes);
247         void (*data2D)(const Context *rsc, const Allocation *alloc,
248                        uint32_t xoff, uint32_t yoff, uint32_t lod,
249                        RsAllocationCubemapFace face, uint32_t w, uint32_t h,
250                        const void *data, size_t sizeBytes, size_t stride);
251         void (*data3D)(const Context *rsc, const Allocation *alloc,
252                        uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
253                        uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes,
254                        size_t stride);
255 
256         void (*read1D)(const Context *rsc, const Allocation *alloc,
257                        uint32_t xoff, uint32_t lod, size_t count,
258                        void *data, size_t sizeBytes);
259         void (*read2D)(const Context *rsc, const Allocation *alloc,
260                        uint32_t xoff, uint32_t yoff, uint32_t lod,
261                        RsAllocationCubemapFace face, uint32_t w, uint32_t h,
262                        void *data, size_t sizeBytes, size_t stride);
263         void (*read3D)(const Context *rsc, const Allocation *alloc,
264                        uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
265                        uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes,
266                        size_t stride);
267 
268         // Lock and unlock make a 1D region of memory available to the CPU
269         // for direct access by pointer.  Once unlock is called control is
270         // returned to the SOC driver.
271         void * (*lock1D)(const Context *rsc, const Allocation *alloc);
272         void (*unlock1D)(const Context *rsc, const Allocation *alloc);
273 
274         // Allocation to allocation copies
275         void (*allocData1D)(const Context *rsc,
276                             const Allocation *dstAlloc,
277                             uint32_t dstXoff, uint32_t dstLod, size_t count,
278                             const Allocation *srcAlloc, uint32_t srcXoff, uint32_t srcLod);
279         void (*allocData2D)(const Context *rsc,
280                             const Allocation *dstAlloc,
281                             uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
282                             RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
283                             const Allocation *srcAlloc,
284                             uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
285                             RsAllocationCubemapFace srcFace);
286         void (*allocData3D)(const Context *rsc,
287                             const Allocation *dstAlloc,
288                             uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff,
289                             uint32_t dstLod,
290                             uint32_t w, uint32_t h, uint32_t d,
291                             const Allocation *srcAlloc,
292                             uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff,
293                             uint32_t srcLod);
294 
295         void (*elementData)(const Context *rsc, const Allocation *alloc,
296                             uint32_t x, uint32_t y, uint32_t z,
297                             const void *data, uint32_t elementOff, size_t sizeBytes);
298         void (*elementRead)(const Context *rsc, const Allocation *alloc,
299                             uint32_t x, uint32_t y, uint32_t z,
300                             void *data, uint32_t elementOff, size_t sizeBytes);
301 
302         void (*generateMipmaps)(const Context *rsc, const Allocation *alloc);
303 
304         void (*updateCachedObject)(const Context *rsc, const Allocation *alloc, rs_allocation *obj);
305 
306         void (*adapterOffset)(const Context *rsc, const Allocation *alloc);
307 
308         void (*getPointer)(const Context *rsc, const Allocation *alloc,
309                            uint32_t lod, RsAllocationCubemapFace face,
310                            uint32_t z, uint32_t array);
311 #ifdef RS_COMPATIBILITY_LIB
312         bool (*initStrided)(const Context *rsc, Allocation *alloc, bool forceZero, size_t requiredAlignment);
313 #endif
314     } allocation;
315 
316     struct {
317         bool (*init)(const Context *rsc, const ProgramStore *ps);
318         void (*setActive)(const Context *rsc, const ProgramStore *ps);
319         void (*destroy)(const Context *rsc, const ProgramStore *ps);
320     } store;
321 
322     struct {
323         bool (*init)(const Context *rsc, const ProgramRaster *ps);
324         void (*setActive)(const Context *rsc, const ProgramRaster *ps);
325         void (*destroy)(const Context *rsc, const ProgramRaster *ps);
326     } raster;
327 
328     struct {
329         bool (*init)(const Context *rsc, const ProgramVertex *pv,
330                      const char* shader, size_t shaderLen,
331                      const char** textureNames, size_t textureNamesCount,
332                      const size_t *textureNamesLength);
333         void (*setActive)(const Context *rsc, const ProgramVertex *pv);
334         void (*destroy)(const Context *rsc, const ProgramVertex *pv);
335     } vertex;
336 
337     struct {
338         bool (*init)(const Context *rsc, const ProgramFragment *pf,
339                      const char* shader, size_t shaderLen,
340                      const char** textureNames, size_t textureNamesCount,
341                      const size_t *textureNamesLength);
342         void (*setActive)(const Context *rsc, const ProgramFragment *pf);
343         void (*destroy)(const Context *rsc, const ProgramFragment *pf);
344     } fragment;
345 
346     struct {
347         bool (*init)(const Context *rsc, const Mesh *m);
348         void (*draw)(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len);
349         void (*destroy)(const Context *rsc, const Mesh *m);
350     } mesh;
351 
352     struct {
353         bool (*init)(const Context *rsc, const Sampler *m);
354         void (*destroy)(const Context *rsc, const Sampler *m);
355         void (*updateCachedObject)(const Context *rsc, const Sampler *s, rs_sampler *obj);
356     } sampler;
357 
358     struct {
359         bool (*init)(const Context *rsc, const FBOCache *fb);
360         void (*setActive)(const Context *rsc, const FBOCache *fb);
361         void (*destroy)(const Context *rsc, const FBOCache *fb);
362     } framebuffer;
363 
364     struct {
365         bool (*init)(const Context *rsc, ScriptGroupBase *sg);
366         void (*setInput)(const Context *rsc, const ScriptGroup *sg,
367                          const ScriptKernelID *kid, Allocation *);
368         void (*setOutput)(const Context *rsc, const ScriptGroup *sg,
369                           const ScriptKernelID *kid, Allocation *);
370         void (*execute)(const Context *rsc, const ScriptGroupBase *sg);
371         void (*destroy)(const Context *rsc, const ScriptGroupBase *sg);
372         void (*updateCachedObject)(const Context *rsc, const ScriptGroup *sg, rs_script_group *obj);
373     } scriptgroup;
374 
375     struct {
376         bool (*init)(const Context *rsc, const Type *m);
377         void (*destroy)(const Context *rsc, const Type *m);
378         void (*updateCachedObject)(const Context *rsc, const Type *s, rs_type *obj);
379     } type;
380 
381     struct {
382         bool (*init)(const Context *rsc, const Element *m);
383         void (*destroy)(const Context *rsc, const Element *m);
384         void (*updateCachedObject)(const Context *rsc, const Element *s, rs_element *obj);
385     } element;
386 
387     void (*finish)(const Context *rsc);
388 } RsdHalFunctions;
389 
390 
391 enum RsHalInitEnums {
392     RS_HAL_CORE_SHUTDOWN                                    = 1,
393     RS_HAL_CORE_SET_PRIORITY                                = 2,
394     RS_HAL_CORE_ALLOC_RUNTIME_MEM                           = 3,
395     RS_HAL_CORE_FREE_RUNTIME_MEM                            = 4,
396     RS_HAL_CORE_FINISH                                      = 5,
397 
398     RS_HAL_SCRIPT_INIT                                      = 1000,
399     RS_HAL_SCRIPT_INIT_INTRINSIC                            = 1001,
400     RS_HAL_SCRIPT_INVOKE_FUNCTION                           = 1002,
401     RS_HAL_SCRIPT_INVOKE_ROOT                               = 1003,
402     RS_HAL_SCRIPT_INVOKE_FOR_EACH                           = 1004,
403     RS_HAL_SCRIPT_INVOKE_INIT                               = 1005,
404     RS_HAL_SCRIPT_INVOKE_FREE_CHILDREN                      = 1006,
405     RS_HAL_SCRIPT_SET_GLOBAL_VAR                            = 1007,
406     RS_HAL_SCRIPT_GET_GLOBAL_VAR                            = 1008,
407     RS_HAL_SCRIPT_SET_GLOBAL_VAR_WITH_ELEMENT_DIM           = 1009,
408     RS_HAL_SCRIPT_SET_GLOBAL_BIND                           = 1010,
409     RS_HAL_SCRIPT_SET_GLOBAL_OBJECT                         = 1011,
410     RS_HAL_SCRIPT_DESTROY                                   = 1012,
411     RS_HAL_SCRIPT_INVOKE_FOR_EACH_MULTI                     = 1013,
412     RS_HAL_SCRIPT_UPDATE_CACHED_OBJECT                      = 1014,
413     RS_HAL_SCRIPT_INVOKE_REDUCE                             = 1015,
414 
415     RS_HAL_ALLOCATION_INIT                                  = 2000,
416     RS_HAL_ALLOCATION_INIT_ADAPTER                          = 2001,
417     RS_HAL_ALLOCATION_DESTROY                               = 2002,
418     RS_HAL_ALLOCATION_GET_GRALLOC_BITS                      = 2003,
419     RS_HAL_ALLOCATION_RESIZE                                = 2004,
420     RS_HAL_ALLOCATION_SYNC_ALL                              = 2005,
421     RS_HAL_ALLOCATION_MARK_DIRTY                            = 2006,
422     RS_HAL_ALLOCATION_SET_SURFACE                           = 2007,
423     RS_HAL_ALLOCATION_IO_SEND                               = 2008,
424     RS_HAL_ALLOCATION_IO_RECEIVE                            = 2009,
425     RS_HAL_ALLOCATION_DATA_1D                               = 2010,
426     RS_HAL_ALLOCATION_DATA_2D                               = 2011,
427     RS_HAL_ALLOCATION_DATA_3D                               = 2012,
428     RS_HAL_ALLOCATION_READ_1D                               = 2013,
429     RS_HAL_ALLOCATION_READ_2D                               = 2014,
430     RS_HAL_ALLOCATION_READ_3D                               = 2015,
431     RS_HAL_ALLOCATION_LOCK_1D                               = 2016,
432     RS_HAL_ALLOCATION_UNLOCK_1D                             = 2017,
433     RS_HAL_ALLOCATION_COPY_1D                               = 2018,
434     RS_HAL_ALLOCATION_COPY_2D                               = 2019,
435     RS_HAL_ALLOCATION_COPY_3D                               = 2020,
436     RS_HAL_ALLOCATION_ELEMENT_DATA                          = 2021,
437     RS_HAL_ALLOCATION_ELEMENT_READ                          = 2022,
438     RS_HAL_ALLOCATION_GENERATE_MIPMAPS                      = 2023,
439     RS_HAL_ALLOCATION_UPDATE_CACHED_OBJECT                  = 2024,
440     RS_HAL_ALLOCATION_ADAPTER_OFFSET                        = 2025,
441     RS_HAL_ALLOCATION_INIT_OEM                              = 2026,
442     RS_HAL_ALLOCATION_GET_POINTER                           = 2027,
443 #ifdef RS_COMPATIBILITY_LIB
444     RS_HAL_ALLOCATION_INIT_STRIDED                          = 2999,
445 #endif
446 
447     RS_HAL_SAMPLER_INIT                                     = 3000,
448     RS_HAL_SAMPLER_DESTROY                                  = 3001,
449     RS_HAL_SAMPLER_UPDATE_CACHED_OBJECT                     = 3002,
450 
451     RS_HAL_TYPE_INIT                                        = 4000,
452     RS_HAL_TYPE_DESTROY                                     = 4001,
453     RS_HAL_TYPE_UPDATE_CACHED_OBJECT                        = 4002,
454 
455     RS_HAL_ELEMENT_INIT                                     = 5000,
456     RS_HAL_ELEMENT_DESTROY                                  = 5001,
457     RS_HAL_ELEMENT_UPDATE_CACHED_OBJECT                     = 5002,
458 
459     RS_HAL_SCRIPT_GROUP_INIT                                = 6000,
460     RS_HAL_SCRIPT_GROUP_DESTROY                             = 6001,
461     RS_HAL_SCRIPT_GROUP_UPDATE_CACHED_OBJECT                = 6002,
462     RS_HAL_SCRIPT_GROUP_SET_INPUT                           = 6003,
463     RS_HAL_SCRIPT_GROUP_SET_OUTPUT                          = 6004,
464     RS_HAL_SCRIPT_GROUP_EXECUTE                             = 6005,
465 
466 
467 
468     RS_HAL_GRAPHICS_INIT                                    = 100001,
469     RS_HAL_GRAPHICS_SHUTDOWN                                = 100002,
470     RS_HAL_GRAPHICS_SWAP                                    = 100003,
471     RS_HAL_GRAPHICS_SET_SURFACE                             = 100004,
472     RS_HAL_GRAPHICS_RASTER_INIT                             = 101000,
473     RS_HAL_GRAPHICS_RASTER_SET_ACTIVE                       = 101001,
474     RS_HAL_GRAPHICS_RASTER_DESTROY                          = 101002,
475     RS_HAL_GRAPHICS_VERTEX_INIT                             = 102000,
476     RS_HAL_GRAPHICS_VERTEX_SET_ACTIVE                       = 102001,
477     RS_HAL_GRAPHICS_VERTEX_DESTROY                          = 102002,
478     RS_HAL_GRAPHICS_FRAGMENT_INIT                           = 103000,
479     RS_HAL_GRAPHICS_FRAGMENT_SET_ACTIVE                     = 103001,
480     RS_HAL_GRAPHICS_FRAGMENT_DESTROY                        = 103002,
481     RS_HAL_GRAPHICS_MESH_INIT                               = 104000,
482     RS_HAL_GRAPHICS_MESH_DRAW                               = 104001,
483     RS_HAL_GRAPHICS_MESH_DESTROY                            = 104002,
484     RS_HAL_GRAPHICS_FB_INIT                                 = 105000,
485     RS_HAL_GRAPHICS_FB_SET_ACTIVE                           = 105001,
486     RS_HAL_GRAPHICS_FB_DESTROY                              = 105002,
487     RS_HAL_GRAPHICS_STORE_INIT                              = 106000,
488     RS_HAL_GRAPHICS_STORE_SET_ACTIVE                        = 106001,
489     RS_HAL_GRAPHICS_STORE_DESTROY                           = 106002,
490 };
491 
492 } // namespace renderscript
493 } // namespace android
494 
495 #ifdef __cplusplus
496 extern "C" {
497 #endif
498 
499 /**
500  * Get the major version number of the driver.  The major
501  * version should be the RS_HAL_VERSION against which the
502  * driver was built
503  *
504  * The Minor version number is vendor specific
505  *
506  * The caller should ensure that *version_major is the same as
507  * RS_HAL_VERSION -- i.e., that the driver (e.g., libRSDriver)
508  * is compatible with the shell (i.e., libRS_internal) responsible
509  * for loading the driver
510  *
511  * return: False will abort loading the driver, true indicates
512  * success
513  */
514 bool rsdHalQueryVersion(uint32_t *version_major, uint32_t *version_minor);
515 
516 
517 /**
518  * Get an entry point in the driver HAL
519  *
520  * The driver should set the function pointer to its
521  * implementation of the function.  If it does not have an entry
522  * for an enum, its should set the function pointer to NULL
523  *
524  * Returning NULL is expected in cases during development as new
525  * entry points are added that a driver may not understand.  If
526  * the runtime receives a NULL it will decide if the function is
527  * required and will either continue loading or abort as needed.
528  *
529  *
530  * return: False will abort loading the driver, true indicates
531  * success
532  *
533  */
534 bool rsdHalQueryHal(android::renderscript::RsHalInitEnums entry, void **fnPtr);
535 
536 
537 /**
538  * Called to initialize the context for use with a driver.
539  *
540  * return: False will abort loading the driver, true indicates
541  * success
542  */
543 bool rsdHalInit(RsContext, uint32_t version_major, uint32_t version_minor);
544 
545 /**
546  * Called if one of the loading functions above returns false.
547  * This is to clean up any resources allocated during an error
548  * condition. If this path is called it means the normal
549  * context->mHal.funcs.shutdown() will not be called.
550  */
551 void rsdHalAbort(RsContext);
552 
553 #ifdef __cplusplus
554 }
555 #endif
556 
557 #endif
558