1bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams/*
22980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines * Copyright (C) 2011-2012 The Android Open Source Project
3bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *
4bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * you may not use this file except in compliance with the License.
6bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * You may obtain a copy of the License at
7bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *
8bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *
10bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * Unless required by applicable law or agreed to in writing, software
11bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * See the License for the specific language governing permissions and
14bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * limitations under the License.
15bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams */
16bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
17bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#ifndef RS_HAL_H
18bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#define RS_HAL_H
19bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
2066f0a168c4227d4e302f4ffb21ec7e9d7b9ca828Jason Sams#include <rsInternalDefines.h>
21bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
228e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross/*
238e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
248e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !! Major version number of the driver.  This is used to ensure that
258e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !! the driver (e.g., libRSDriver) is compatible with the shell
268e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !! (i.e., libRS_internal) responsible for loading the driver.
278e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !! There is no notion of backwards compatibility -- the driver and
288e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !! the shell must agree on the major version number.
298e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !!
308e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !! The version number must change whenever there is a semantic change
318e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !! to the HAL such as adding or removing an entry point or changing
328e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !! the meaning of an entry point.  By convention it is monotonically
338e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !! increasing across all branches (e.g., aosp/master and all internal
348e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !! branches).
358e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !!
368e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !! Be very careful when merging or cherry picking between branches!
378e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
388e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross */
39f750c530392a2895cb4b7e5b5e5e5259925b2015Miao Wang#define RS_HAL_VERSION 200
408e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross
410ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams/**
420ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * The interface for loading RenderScript drivers
430ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams *
440ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * The startup sequence is
450ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams *
460ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * 1: dlopen driver
478e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * 2: Query driver version with rsdHalQueryVersion() and verify
488e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross *    that the driver (e.g., libRSDriver) is compatible with the shell
498e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross *    (i.e., libRS_internal) responsible for loading the driver
500ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * 3: Fill in HAL pointer table with calls to rsdHalQueryHAL()
510ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * 4: Initialize the context with rsdHalInit()
520ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams *
530ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * If any of these functions return false, the loading of the
540ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * driver will abort and the reference driver will be used.
550ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * rsdHalAbort() will be called to clean up any partially
560ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * allocated state.
570ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams *
58b9276ce624182bb72ff18e430872be5c918ba7ceJason Sams * A driver should return FALSE for any conditions that will
59b9276ce624182bb72ff18e430872be5c918ba7ceJason Sams * prevent the driver from working normally.
60b9276ce624182bb72ff18e430872be5c918ba7ceJason Sams *
61b9276ce624182bb72ff18e430872be5c918ba7ceJason Sams *
620ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * If these are successful, the driver will be loaded and used
630ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * normally.  Teardown will use the normal
640ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * context->mHal.funcs.shutdown() path.  There will be no call
650ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * to rsdHalAbort().
660ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams *
670ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams *
680ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams */
690ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
700ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
717ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsstruct ANativeWindow;
727ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams
73bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsnamespace android {
74bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsnamespace renderscript {
75bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
76bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass Context;
77bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass ObjectBase;
78bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass Element;
79bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass Type;
80bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass Allocation;
81bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass Script;
82dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ScriptKernelID;
83dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ScriptFieldID;
84dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ScriptMethodID;
85bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsclass ScriptC;
86dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ScriptGroup;
871ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass ScriptGroupBase;
889e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsclass Path;
897f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchoukclass Program;
908feea4e0dec48ea03bd6d32706d058b86dddc5baJason Samsclass ProgramStore;
91721acc495b859c6d884725a4f9b5523583dd11c7Jason Samsclass ProgramRaster;
92a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass ProgramVertex;
93a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass ProgramFragment;
94a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass Mesh;
957f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchoukclass Sampler;
96da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchoukclass FBOCache;
97bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
98a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams/**
99a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams * Define the internal object types.  This ia a mirror of the
100a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams * definition in rs_types.rsh except with the p value typed
101a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams * correctly.
102a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams *
103a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams * p = pointer to internal object implementation
104700e68883c4324c15b380ff6724249f39d4f498cI-Jui (Ray) Sung * unused1, unused2, unused3 = reserved for ABI compatibility
105a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams */
106a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
107863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet// RS_BASE_OBJ must have the same layout as _RS_OBJECT_DECL defined in
108863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet// script_api/rs_object_types.spec.
109863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet// TODO(jeanluc) Look at unifying.
110a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#ifndef __LP64__
111a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#define RS_BASE_OBJ(_t_) typedef struct { const _t_* p; } __attribute__((packed, aligned(4)))
112863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet#define RS_BASE_NULL_OBJ {0}
113a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#else
114700e68883c4324c15b380ff6724249f39d4f498cI-Jui (Ray) Sung#define RS_BASE_OBJ(_t_) typedef struct { const _t_* p; const void* unused1; const void* unused2; const void* unused3; }
115863237215cab4812df373b63ba3bbf2bc1d8647dJean-Luc Brouillet#define RS_BASE_NULL_OBJ {0, 0, 0, 0}
116a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#endif
117a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
11805ef73f2d934f1083cc3b8aeb33fe21de9d6e88fJason SamsRS_BASE_OBJ(ObjectBase) rs_object_base;
119a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason SamsRS_BASE_OBJ(Element) rs_element;
120a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason SamsRS_BASE_OBJ(Type) rs_type;
121a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason SamsRS_BASE_OBJ(Allocation) rs_allocation;
122a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason SamsRS_BASE_OBJ(Sampler) rs_sampler;
123a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason SamsRS_BASE_OBJ(Script) rs_script;
124a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason SamsRS_BASE_OBJ(ScriptGroup) rs_script_group;
125a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
126a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#ifndef __LP64__
127a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_mesh;
128a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_fragment;
129a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_vertex;
130a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_raster;
131a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_store;
132a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samstypedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_font;
133a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams#endif // __LP64__
134a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
135a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
136bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samstypedef void *(*RsHalSymbolLookupFunc)(void *usrptr, char const *symbolName);
137bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
138bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams/**
139bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * Script management functions
140bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams */
141bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samstypedef struct {
142025a1f48df53a3bd13dd3a5d765a7a78de3a1bf5Miao Wang    int (*initGraphics)(const Context *);
1434b3de47071d875faaa7d419d050a464b09538797Jason Sams    void (*shutdownGraphics)(const Context *);
1447257c7ee4b66f00c43d9235f3ac600061ae79968Alex Sakhartchouk    bool (*setSurface)(const Context *, uint32_t w, uint32_t h, RsNativeWindow);
1454b3de47071d875faaa7d419d050a464b09538797Jason Sams    void (*swap)(const Context *);
1464b3de47071d875faaa7d419d050a464b09538797Jason Sams
147cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    void (*shutdownDriver)(Context *);
148cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    void (*setPriority)(const Context *, int32_t priority);
149bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
15034689388556747b52c3c2f1c894929fb44580898Tim Murray    void* (*allocRuntimeMem)(size_t size, uint32_t flags);
15134689388556747b52c3c2f1c894929fb44580898Tim Murray    void (*freeRuntimeMem)(void* ptr);
152bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
153bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    struct {
1548feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        bool (*init)(const Context *rsc, ScriptC *s,
1558feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams                     char const *resName,
1568feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams                     char const *cacheDir,
1578feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams                     uint8_t const *bitcode,
1588feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams                     size_t bitcodeSize,
15987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                     uint32_t flags);
1608eaba4fee0c7b5325742c87187622fdff51d5effJason Sams        bool (*initIntrinsic)(const Context *rsc, Script *s,
16141d6c769f5fa21da3cbc116af95d88949a4a5c76Stephen Hines                              RsScriptIntrinsicID iid,
1628eaba4fee0c7b5325742c87187622fdff51d5effJason Sams                              Element *e);
163bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
164cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        void (*invokeFunction)(const Context *rsc, Script *s,
165bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                               uint32_t slot,
166bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                               const void *params,
167bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                               size_t paramLength);
168cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        int (*invokeRoot)(const Context *rsc, Script *s);
169cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        void (*invokeForEach)(const Context *rsc,
170cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams                              Script *s,
17135e429ebf817130d8590d11d441a77aa697bd7d4Jason Sams                              uint32_t slot,
172cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams                              const Allocation * ain,
173cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams                              Allocation * aout,
174cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams                              const void * usr,
175099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                              size_t usrLen,
176cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams                              const RsScriptCall *sc);
17714ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala        void (*invokeReduce)(const Context *rsc, Script *s,
178ae2ec3febedfc29376b9104413fb4042028f1265David Gross                             uint32_t slot,
179ae2ec3febedfc29376b9104413fb4042028f1265David Gross                             const Allocation ** ains, size_t inLen,
18014ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala                             Allocation *aout,
18114ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala                             const RsScriptCall *sc);
182cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        void (*invokeInit)(const Context *rsc, Script *s);
1834ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines        void (*invokeFreeChildren)(const Context *rsc, Script *s);
184bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
185bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        void (*setGlobalVar)(const Context *rsc, const Script *s,
186bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                             uint32_t slot,
1879c64239ebbfa4170190ede812e69150035e008e0Tim Murray                             void *data,
1889c64239ebbfa4170190ede812e69150035e008e0Tim Murray                             size_t dataLength);
1899c64239ebbfa4170190ede812e69150035e008e0Tim Murray        void (*getGlobalVar)(const Context *rsc, const Script *s,
1909c64239ebbfa4170190ede812e69150035e008e0Tim Murray                             uint32_t slot,
191bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                             void *data,
192bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                             size_t dataLength);
1932980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        void (*setGlobalVarWithElemDims)(const Context *rsc, const Script *s,
1942980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines                                         uint32_t slot,
1952980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines                                         void *data,
1962980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines                                         size_t dataLength,
1972980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines                                         const Element *e,
198ac8d146a41f18afad5314ac8af440d6aedbe20bfStephen Hines                                         const uint32_t *dims,
1992980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines                                         size_t dimLength);
200bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        void (*setGlobalBind)(const Context *rsc, const Script *s,
201bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                              uint32_t slot,
202807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                              Allocation *data);
203bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        void (*setGlobalObj)(const Context *rsc, const Script *s,
204bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                             uint32_t slot,
205bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                             ObjectBase *data);
206bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
207bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        void (*destroy)(const Context *rsc, Script *s);
2084b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes        void (*invokeForEachMulti)(const Context *rsc,
2094b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   Script *s,
2104b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   uint32_t slot,
2114b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   const Allocation ** ains,
2124b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   size_t inLen,
2134b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   Allocation * aout,
2144b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   const void * usr,
2154b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   size_t usrLen,
2164b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                                   const RsScriptCall *sc);
217a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*updateCachedObject)(const Context *rsc, const Script *, rs_script *obj);
218bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    } script;
219bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
2208feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    struct {
221eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        bool (*init)(const Context *rsc, Allocation *alloc, bool forceZero);
222f82b626e0479ce4a23ebff1fc088e073dcabaa30Jason Sams        bool (*initOem)(const Context *rsc, Allocation *alloc, bool forceZero, void *usrPtr);
223bc9dc27b84f4e5c72d4dbe8a8e01af87dd780f79Jason Sams        bool (*initAdapter)(const Context *rsc, Allocation *alloc);
224eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*destroy)(const Context *rsc, Allocation *alloc);
225ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        uint32_t (*grallocBits)(const Context *rsc, Allocation *alloc);
226eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams
227eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*resize)(const Context *rsc, const Allocation *alloc, const Type *newType,
228eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams                       bool zeroNew);
229eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*syncAll)(const Context *rsc, const Allocation *alloc, RsAllocationUsageType src);
230eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*markDirty)(const Context *rsc, const Allocation *alloc);
2317ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams
232733396b67724162844ea2785c7495115dc5ee8d8Jason Sams        void (*setSurface)(const Context *rsc, Allocation *alloc, ANativeWindow *sur);
2337ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams        void (*ioSend)(const Context *rsc, Allocation *alloc);
234ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
235ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams        /**
236ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams         * A new gralloc buffer is in use. The pointers and strides in
237ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams         * mHal.drvState.lod[0-2] will be updated with the new values.
238ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams         *
239ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams         * The new gralloc handle is provided in mHal.state.nativeBuffer
240ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams         *
241ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams         */
2427ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams        void (*ioReceive)(const Context *rsc, Allocation *alloc);
243eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams
244eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*data1D)(const Context *rsc, const Allocation *alloc,
245099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                       uint32_t xoff, uint32_t lod, size_t count,
246c794cd56e46408e08862c42a022090e323684197Alex Sakhartchouk                       const void *data, size_t sizeBytes);
247eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*data2D)(const Context *rsc, const Allocation *alloc,
248eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams                       uint32_t xoff, uint32_t yoff, uint32_t lod,
249eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams                       RsAllocationCubemapFace face, uint32_t w, uint32_t h,
250358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                       const void *data, size_t sizeBytes, size_t stride);
251eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        void (*data3D)(const Context *rsc, const Allocation *alloc,
2523bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                       uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
2533bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                       uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes,
2543bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                       size_t stride);
255eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams
256807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        void (*read1D)(const Context *rsc, const Allocation *alloc,
257099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                       uint32_t xoff, uint32_t lod, size_t count,
258807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                       void *data, size_t sizeBytes);
259807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        void (*read2D)(const Context *rsc, const Allocation *alloc,
260807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                       uint32_t xoff, uint32_t yoff, uint32_t lod,
261807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                       RsAllocationCubemapFace face, uint32_t w, uint32_t h,
262358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                       void *data, size_t sizeBytes, size_t stride);
263807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        void (*read3D)(const Context *rsc, const Allocation *alloc,
2643bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                       uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
2653bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                       uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes,
2663bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                       size_t stride);
267807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
268807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        // Lock and unlock make a 1D region of memory available to the CPU
269807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        // for direct access by pointer.  Once unlock is called control is
270807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        // returned to the SOC driver.
271807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        void * (*lock1D)(const Context *rsc, const Allocation *alloc);
272807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        void (*unlock1D)(const Context *rsc, const Allocation *alloc);
273807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
27474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk        // Allocation to allocation copies
27574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk        void (*allocData1D)(const Context *rsc,
27674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            const Allocation *dstAlloc,
277099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray                            uint32_t dstXoff, uint32_t dstLod, size_t count,
27874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            const Allocation *srcAlloc, uint32_t srcXoff, uint32_t srcLod);
27974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk        void (*allocData2D)(const Context *rsc,
28074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            const Allocation *dstAlloc,
28174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
28274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
28374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            const Allocation *srcAlloc,
28474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
28574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            RsAllocationCubemapFace srcFace);
28674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk        void (*allocData3D)(const Context *rsc,
28774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            const Allocation *dstAlloc,
28874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff,
2893bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                            uint32_t dstLod,
29074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t w, uint32_t h, uint32_t d,
29174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            const Allocation *srcAlloc,
29274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff,
2933bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams                            uint32_t srcLod);
29474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
295cc8cea7477352898921044483a6c803e25d02665Miao Wang        void (*elementData)(const Context *rsc, const Allocation *alloc,
296cc8cea7477352898921044483a6c803e25d02665Miao Wang                            uint32_t x, uint32_t y, uint32_t z,
297cc8cea7477352898921044483a6c803e25d02665Miao Wang                            const void *data, uint32_t elementOff, size_t sizeBytes);
298cc8cea7477352898921044483a6c803e25d02665Miao Wang        void (*elementRead)(const Context *rsc, const Allocation *alloc,
299cc8cea7477352898921044483a6c803e25d02665Miao Wang                            uint32_t x, uint32_t y, uint32_t z,
300cc8cea7477352898921044483a6c803e25d02665Miao Wang                            void *data, uint32_t elementOff, size_t sizeBytes);
301eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams
30261a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams        void (*generateMipmaps)(const Context *rsc, const Allocation *alloc);
303a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
304a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*updateCachedObject)(const Context *rsc, const Allocation *alloc, rs_allocation *obj);
305bc9dc27b84f4e5c72d4dbe8a8e01af87dd780f79Jason Sams
306bc9dc27b84f4e5c72d4dbe8a8e01af87dd780f79Jason Sams        void (*adapterOffset)(const Context *rsc, const Allocation *alloc);
3078ce12815675bfaeb2768959b092d6db293ba36c5Jason Sams
3088ce12815675bfaeb2768959b092d6db293ba36c5Jason Sams        void (*getPointer)(const Context *rsc, const Allocation *alloc,
3098ce12815675bfaeb2768959b092d6db293ba36c5Jason Sams                           uint32_t lod, RsAllocationCubemapFace face,
3108ce12815675bfaeb2768959b092d6db293ba36c5Jason Sams                           uint32_t z, uint32_t array);
31147a5881b8f85d65c74f2471fe6261d4cdb3dce5eMiao Wang#ifdef RS_COMPATIBILITY_LIB
31247a5881b8f85d65c74f2471fe6261d4cdb3dce5eMiao Wang        bool (*initStrided)(const Context *rsc, Allocation *alloc, bool forceZero, size_t requiredAlignment);
31347a5881b8f85d65c74f2471fe6261d4cdb3dce5eMiao Wang#endif
314eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    } allocation;
315eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams
316eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    struct {
3178feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        bool (*init)(const Context *rsc, const ProgramStore *ps);
3188feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        void (*setActive)(const Context *rsc, const ProgramStore *ps);
3198feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams        void (*destroy)(const Context *rsc, const ProgramStore *ps);
3208feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams    } store;
3218feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
322721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    struct {
323721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams        bool (*init)(const Context *rsc, const ProgramRaster *ps);
324721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams        void (*setActive)(const Context *rsc, const ProgramRaster *ps);
325721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams        void (*destroy)(const Context *rsc, const ProgramRaster *ps);
326721acc495b859c6d884725a4f9b5523583dd11c7Jason Sams    } raster;
3278feea4e0dec48ea03bd6d32706d058b86dddc5baJason Sams
328a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    struct {
329a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        bool (*init)(const Context *rsc, const ProgramVertex *pv,
330748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk                     const char* shader, size_t shaderLen,
331748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk                     const char** textureNames, size_t textureNamesCount,
332748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk                     const size_t *textureNamesLength);
333a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        void (*setActive)(const Context *rsc, const ProgramVertex *pv);
334a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        void (*destroy)(const Context *rsc, const ProgramVertex *pv);
335a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    } vertex;
336a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
337a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    struct {
338a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        bool (*init)(const Context *rsc, const ProgramFragment *pf,
339748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk                     const char* shader, size_t shaderLen,
340748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk                     const char** textureNames, size_t textureNamesCount,
341748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk                     const size_t *textureNamesLength);
342a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        void (*setActive)(const Context *rsc, const ProgramFragment *pf);
343a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        void (*destroy)(const Context *rsc, const ProgramFragment *pf);
344a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    } fragment;
345a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
346a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    struct {
347a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        bool (*init)(const Context *rsc, const Mesh *m);
348a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        void (*draw)(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len);
349a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        void (*destroy)(const Context *rsc, const Mesh *m);
350a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    } mesh;
351bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
3527f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk    struct {
3537f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk        bool (*init)(const Context *rsc, const Sampler *m);
3547f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk        void (*destroy)(const Context *rsc, const Sampler *m);
355a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*updateCachedObject)(const Context *rsc, const Sampler *s, rs_sampler *obj);
3567f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk    } sampler;
3577f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk
358da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk    struct {
359da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk        bool (*init)(const Context *rsc, const FBOCache *fb);
360da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk        void (*setActive)(const Context *rsc, const FBOCache *fb);
361da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk        void (*destroy)(const Context *rsc, const FBOCache *fb);
362da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk    } framebuffer;
363da6d34a5a6ece8c30d20673b9b6ff07d8c91768bAlex Sakhartchouk
364dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    struct {
3651ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni        bool (*init)(const Context *rsc, ScriptGroupBase *sg);
366dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        void (*setInput)(const Context *rsc, const ScriptGroup *sg,
367dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                         const ScriptKernelID *kid, Allocation *);
368dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        void (*setOutput)(const Context *rsc, const ScriptGroup *sg,
369dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                          const ScriptKernelID *kid, Allocation *);
3701ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni        void (*execute)(const Context *rsc, const ScriptGroupBase *sg);
3711ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni        void (*destroy)(const Context *rsc, const ScriptGroupBase *sg);
372a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*updateCachedObject)(const Context *rsc, const ScriptGroup *sg, rs_script_group *obj);
373dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    } scriptgroup;
374dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
375a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    struct {
376a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        bool (*init)(const Context *rsc, const Type *m);
377a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*destroy)(const Context *rsc, const Type *m);
378a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*updateCachedObject)(const Context *rsc, const Type *s, rs_type *obj);
379a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    } type;
380a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
381a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    struct {
382a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        bool (*init)(const Context *rsc, const Element *m);
383a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*destroy)(const Context *rsc, const Element *m);
384a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        void (*updateCachedObject)(const Context *rsc, const Element *s, rs_element *obj);
385a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    } element;
386a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
3879761c3fcb8cf2ce89a29cb9202e4282d94f33d9dJason Sams    void (*finish)(const Context *rsc);
388bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams} RsdHalFunctions;
389bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
390bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
3910ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Samsenum RsHalInitEnums {
3920ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_CORE_SHUTDOWN                                    = 1,
3930ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_CORE_SET_PRIORITY                                = 2,
3940ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_CORE_ALLOC_RUNTIME_MEM                           = 3,
3950ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_CORE_FREE_RUNTIME_MEM                            = 4,
3960ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_CORE_FINISH                                      = 5,
3970ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
3980ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_INIT                                      = 1000,
3990ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_INIT_INTRINSIC                            = 1001,
4000ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_INVOKE_FUNCTION                           = 1002,
4010ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_INVOKE_ROOT                               = 1003,
4020ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_INVOKE_FOR_EACH                           = 1004,
4030ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_INVOKE_INIT                               = 1005,
4040ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_INVOKE_FREE_CHILDREN                      = 1006,
4050ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_SET_GLOBAL_VAR                            = 1007,
4060ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_GET_GLOBAL_VAR                            = 1008,
4070ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_SET_GLOBAL_VAR_WITH_ELEMENT_DIM           = 1009,
4080ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_SET_GLOBAL_BIND                           = 1010,
4090ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_SET_GLOBAL_OBJECT                         = 1011,
4100ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_DESTROY                                   = 1012,
4110ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_INVOKE_FOR_EACH_MULTI                     = 1013,
4120ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_UPDATE_CACHED_OBJECT                      = 1014,
41314ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala    RS_HAL_SCRIPT_INVOKE_REDUCE                             = 1015,
4140ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
4150ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_INIT                                  = 2000,
4160ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_INIT_ADAPTER                          = 2001,
4170ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_DESTROY                               = 2002,
4180ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_GET_GRALLOC_BITS                      = 2003,
4190ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_RESIZE                                = 2004,
4200ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_SYNC_ALL                              = 2005,
4210ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_MARK_DIRTY                            = 2006,
4220ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_SET_SURFACE                           = 2007,
4230ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_IO_SEND                               = 2008,
4240ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_IO_RECEIVE                            = 2009,
4250ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_DATA_1D                               = 2010,
4260ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_DATA_2D                               = 2011,
4270ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_DATA_3D                               = 2012,
4280ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_READ_1D                               = 2013,
4290ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_READ_2D                               = 2014,
4300ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_READ_3D                               = 2015,
4310ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_LOCK_1D                               = 2016,
4320ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_UNLOCK_1D                             = 2017,
4330ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_COPY_1D                               = 2018,
4340ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_COPY_2D                               = 2019,
4350ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_COPY_3D                               = 2020,
4360ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_ELEMENT_DATA                          = 2021,
4370ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_ELEMENT_READ                          = 2022,
4380ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_GENERATE_MIPMAPS                      = 2023,
4390ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_UPDATE_CACHED_OBJECT                  = 2024,
4400ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ALLOCATION_ADAPTER_OFFSET                        = 2025,
441f82b626e0479ce4a23ebff1fc088e073dcabaa30Jason Sams    RS_HAL_ALLOCATION_INIT_OEM                              = 2026,
4428ce12815675bfaeb2768959b092d6db293ba36c5Jason Sams    RS_HAL_ALLOCATION_GET_POINTER                           = 2027,
44347a5881b8f85d65c74f2471fe6261d4cdb3dce5eMiao Wang#ifdef RS_COMPATIBILITY_LIB
44447a5881b8f85d65c74f2471fe6261d4cdb3dce5eMiao Wang    RS_HAL_ALLOCATION_INIT_STRIDED                          = 2999,
44547a5881b8f85d65c74f2471fe6261d4cdb3dce5eMiao Wang#endif
4460ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
4470ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SAMPLER_INIT                                     = 3000,
4480ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SAMPLER_DESTROY                                  = 3001,
4490ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SAMPLER_UPDATE_CACHED_OBJECT                     = 3002,
4500ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
4510ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_TYPE_INIT                                        = 4000,
4520ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_TYPE_DESTROY                                     = 4001,
4530ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_TYPE_UPDATE_CACHED_OBJECT                        = 4002,
4540ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
4550ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ELEMENT_INIT                                     = 5000,
4560ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ELEMENT_DESTROY                                  = 5001,
4570ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_ELEMENT_UPDATE_CACHED_OBJECT                     = 5002,
4580ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
4590ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_GROUP_INIT                                = 6000,
4600ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_GROUP_DESTROY                             = 6001,
4610ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_GROUP_UPDATE_CACHED_OBJECT                = 6002,
4620ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_GROUP_SET_INPUT                           = 6003,
4630ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_GROUP_SET_OUTPUT                          = 6004,
4640ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_SCRIPT_GROUP_EXECUTE                             = 6005,
4650ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
4660ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
4670ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
4680ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_INIT                                    = 100001,
4690ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_SHUTDOWN                                = 100002,
4700ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_SWAP                                    = 100003,
4710ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_SET_SURFACE                             = 100004,
4720ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_RASTER_INIT                             = 101000,
4730ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_RASTER_SET_ACTIVE                       = 101001,
4740ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_RASTER_DESTROY                          = 101002,
4750ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_VERTEX_INIT                             = 102000,
4760ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_VERTEX_SET_ACTIVE                       = 102001,
4770ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_VERTEX_DESTROY                          = 102002,
4780ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_FRAGMENT_INIT                           = 103000,
4790ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_FRAGMENT_SET_ACTIVE                     = 103001,
4800ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_FRAGMENT_DESTROY                        = 103002,
4810ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_MESH_INIT                               = 104000,
4820ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_MESH_DRAW                               = 104001,
4830ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_MESH_DESTROY                            = 104002,
4840ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_FB_INIT                                 = 105000,
4850ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_FB_SET_ACTIVE                           = 105001,
4860ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_FB_DESTROY                              = 105002,
4870ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_STORE_INIT                              = 106000,
4880ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_STORE_SET_ACTIVE                        = 106001,
4890ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    RS_HAL_GRAPHICS_STORE_DESTROY                           = 106002,
4900ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams};
4910ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
4927974fc03e11f3a8dd40f794f3b33b4889483090cRahul Chaudhry} // namespace renderscript
4937974fc03e11f3a8dd40f794f3b33b4889483090cRahul Chaudhry} // namespace android
494bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
495414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#ifdef __cplusplus
496414a46166126da6864258bd25ff183f9a3c6261dStephen Hinesextern "C" {
497414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#endif
498414a46166126da6864258bd25ff183f9a3c6261dStephen Hines
4990ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams/**
5000ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * Get the major version number of the driver.  The major
5018e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * version should be the RS_HAL_VERSION against which the
5028e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * driver was built
5030ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams *
5040ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * The Minor version number is vendor specific
5050ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams *
5068e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * The caller should ensure that *version_major is the same as
5078e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * RS_HAL_VERSION -- i.e., that the driver (e.g., libRSDriver)
5088e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * is compatible with the shell (i.e., libRS_internal) responsible
5098e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross * for loading the driver
5108e70791ff732ce244077310bdfdaf75dc19baabcDavid Gross *
5110ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * return: False will abort loading the driver, true indicates
5120ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * success
5130ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams */
5140ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Samsbool rsdHalQueryVersion(uint32_t *version_major, uint32_t *version_minor);
5150ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
5160ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
5170ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams/**
5180ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * Get an entry point in the driver HAL
5190ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams *
5200ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * The driver should set the function pointer to its
5210ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * implementation of the function.  If it does not have an entry
5220ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * for an enum, its should set the function pointer to NULL
5230ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams *
524b9276ce624182bb72ff18e430872be5c918ba7ceJason Sams * Returning NULL is expected in cases during development as new
525b9276ce624182bb72ff18e430872be5c918ba7ceJason Sams * entry points are added that a driver may not understand.  If
526b9276ce624182bb72ff18e430872be5c918ba7ceJason Sams * the runtime receives a NULL it will decide if the function is
527b9276ce624182bb72ff18e430872be5c918ba7ceJason Sams * required and will either continue loading or abort as needed.
528b9276ce624182bb72ff18e430872be5c918ba7ceJason Sams *
529b9276ce624182bb72ff18e430872be5c918ba7ceJason Sams *
5300ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * return: False will abort loading the driver, true indicates
5310ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * success
532b9276ce624182bb72ff18e430872be5c918ba7ceJason Sams *
5330ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams */
5340ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Samsbool rsdHalQueryHal(android::renderscript::RsHalInitEnums entry, void **fnPtr);
5350ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
5360ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
5370ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams/**
5380ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * Called to initialize the context for use with a driver.
5390ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams *
5400ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * return: False will abort loading the driver, true indicates
5410ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * success
5420ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams */
543414a46166126da6864258bd25ff183f9a3c6261dStephen Hinesbool rsdHalInit(RsContext, uint32_t version_major, uint32_t version_minor);
544bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
5450ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams/**
5460ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * Called if one of the loading functions above returns false.
5470ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * This is to clean up any resources allocated during an error
5480ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * condition. If this path is called it means the normal
5490ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams * context->mHal.funcs.shutdown() will not be called.
5500ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams */
5510ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Samsvoid rsdHalAbort(RsContext);
5520ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams
553414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#ifdef __cplusplus
554414a46166126da6864258bd25ff183f9a3c6261dStephen Hines}
555414a46166126da6864258bd25ff183f9a3c6261dStephen Hines#endif
556bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
557bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#endif
558