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