• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <rsDefines.h>
21 
22 struct ANativeWindow;
23 
24 namespace android {
25 namespace renderscript {
26 
27 class Context;
28 class ObjectBase;
29 class Element;
30 class Type;
31 class Allocation;
32 class Script;
33 class ScriptKernelID;
34 class ScriptFieldID;
35 class ScriptMethodID;
36 class ScriptC;
37 class ScriptGroup;
38 class Path;
39 class Program;
40 class ProgramStore;
41 class ProgramRaster;
42 class ProgramVertex;
43 class ProgramFragment;
44 class Mesh;
45 class Sampler;
46 class FBOCache;
47 
48 /**
49  * Define the internal object types.  This ia a mirror of the
50  * definition in rs_types.rsh except with the p value typed
51  * correctly.
52  *
53  * p = pointer to internal object implementation
54  * r = reserved by libRS runtime
55  * v1 = Mirror of p->mHal.drv
56  * v2 = reserved for use by vendor drivers
57  */
58 
59 #ifndef __LP64__
60 #define RS_BASE_OBJ(_t_) typedef struct { const _t_* p; } __attribute__((packed, aligned(4)))
61 #else
62 #define RS_BASE_OBJ(_t_) typedef struct { const _t_* p; const void* r; const void* v1; const void* v2; }
63 #endif
64 
65 RS_BASE_OBJ(ObjectBase) rs_object_base;
66 RS_BASE_OBJ(Element) rs_element;
67 RS_BASE_OBJ(Type) rs_type;
68 RS_BASE_OBJ(Allocation) rs_allocation;
69 RS_BASE_OBJ(Sampler) rs_sampler;
70 RS_BASE_OBJ(Script) rs_script;
71 RS_BASE_OBJ(ScriptGroup) rs_script_group;
72 
73 #ifndef __LP64__
74 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_mesh;
75 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_path;
76 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_fragment;
77 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_vertex;
78 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_raster;
79 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_program_store;
80 typedef struct { const int* p; } __attribute__((packed, aligned(4))) rs_font;
81 #endif // __LP64__
82 
83 
84 typedef void *(*RsHalSymbolLookupFunc)(void *usrptr, char const *symbolName);
85 
86 /**
87  * Script management functions
88  */
89 typedef struct {
90     bool (*initGraphics)(const Context *);
91     void (*shutdownGraphics)(const Context *);
92     bool (*setSurface)(const Context *, uint32_t w, uint32_t h, RsNativeWindow);
93     void (*swap)(const Context *);
94 
95     void (*shutdownDriver)(Context *);
96     void (*getVersion)(unsigned int *major, unsigned int *minor);
97     void (*setPriority)(const Context *, int32_t priority);
98 
99     void* (*allocRuntimeMem)(size_t size, uint32_t flags);
100     void (*freeRuntimeMem)(void* ptr);
101 
102     struct {
103         bool (*init)(const Context *rsc, ScriptC *s,
104                      char const *resName,
105                      char const *cacheDir,
106                      uint8_t const *bitcode,
107                      size_t bitcodeSize,
108                      uint32_t flags);
109         bool (*initIntrinsic)(const Context *rsc, Script *s,
110                               RsScriptIntrinsicID iid,
111                               Element *e);
112 
113         void (*invokeFunction)(const Context *rsc, Script *s,
114                                uint32_t slot,
115                                const void *params,
116                                size_t paramLength);
117         int (*invokeRoot)(const Context *rsc, Script *s);
118         void (*invokeForEach)(const Context *rsc,
119                               Script *s,
120                               uint32_t slot,
121                               const Allocation * ain,
122                               Allocation * aout,
123                               const void * usr,
124                               size_t usrLen,
125                               const RsScriptCall *sc);
126         void (*invokeInit)(const Context *rsc, Script *s);
127         void (*invokeFreeChildren)(const Context *rsc, Script *s);
128 
129         void (*setGlobalVar)(const Context *rsc, const Script *s,
130                              uint32_t slot,
131                              void *data,
132                              size_t dataLength);
133         void (*getGlobalVar)(const Context *rsc, const Script *s,
134                              uint32_t slot,
135                              void *data,
136                              size_t dataLength);
137         void (*setGlobalVarWithElemDims)(const Context *rsc, const Script *s,
138                                          uint32_t slot,
139                                          void *data,
140                                          size_t dataLength,
141                                          const Element *e,
142                                          const uint32_t *dims,
143                                          size_t dimLength);
144         void (*setGlobalBind)(const Context *rsc, const Script *s,
145                               uint32_t slot,
146                               Allocation *data);
147         void (*setGlobalObj)(const Context *rsc, const Script *s,
148                              uint32_t slot,
149                              ObjectBase *data);
150 
151         void (*destroy)(const Context *rsc, Script *s);
152         void (*invokeForEachMulti)(const Context *rsc,
153                                    Script *s,
154                                    uint32_t slot,
155                                    const Allocation ** ains,
156                                    size_t inLen,
157                                    Allocation * aout,
158                                    const void * usr,
159                                    size_t usrLen,
160                                    const RsScriptCall *sc);
161         void (*updateCachedObject)(const Context *rsc, const Script *, rs_script *obj);
162     } script;
163 
164     struct {
165         bool (*init)(const Context *rsc, Allocation *alloc, bool forceZero);
166         void (*destroy)(const Context *rsc, Allocation *alloc);
167         uint32_t (*grallocBits)(const Context *rsc, Allocation *alloc);
168 
169         void (*resize)(const Context *rsc, const Allocation *alloc, const Type *newType,
170                        bool zeroNew);
171         void (*syncAll)(const Context *rsc, const Allocation *alloc, RsAllocationUsageType src);
172         void (*markDirty)(const Context *rsc, const Allocation *alloc);
173 
174         void (*setSurface)(const Context *rsc, Allocation *alloc, ANativeWindow *sur);
175         void (*ioSend)(const Context *rsc, Allocation *alloc);
176 
177         /**
178          * A new gralloc buffer is in use. The pointers and strides in
179          * mHal.drvState.lod[0-2] will be updated with the new values.
180          *
181          * The new gralloc handle is provided in mHal.state.nativeBuffer
182          *
183          */
184         void (*ioReceive)(const Context *rsc, Allocation *alloc);
185 
186         void (*data1D)(const Context *rsc, const Allocation *alloc,
187                        uint32_t xoff, uint32_t lod, size_t count,
188                        const void *data, size_t sizeBytes);
189         void (*data2D)(const Context *rsc, const Allocation *alloc,
190                        uint32_t xoff, uint32_t yoff, uint32_t lod,
191                        RsAllocationCubemapFace face, uint32_t w, uint32_t h,
192                        const void *data, size_t sizeBytes, size_t stride);
193         void (*data3D)(const Context *rsc, const Allocation *alloc,
194                        uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
195                        uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes,
196                        size_t stride);
197 
198         void (*read1D)(const Context *rsc, const Allocation *alloc,
199                        uint32_t xoff, uint32_t lod, size_t count,
200                        void *data, size_t sizeBytes);
201         void (*read2D)(const Context *rsc, const Allocation *alloc,
202                        uint32_t xoff, uint32_t yoff, uint32_t lod,
203                        RsAllocationCubemapFace face, uint32_t w, uint32_t h,
204                        void *data, size_t sizeBytes, size_t stride);
205         void (*read3D)(const Context *rsc, const Allocation *alloc,
206                        uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod,
207                        uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes,
208                        size_t stride);
209 
210         // Lock and unlock make a 1D region of memory available to the CPU
211         // for direct access by pointer.  Once unlock is called control is
212         // returned to the SOC driver.
213         void * (*lock1D)(const Context *rsc, const Allocation *alloc);
214         void (*unlock1D)(const Context *rsc, const Allocation *alloc);
215 
216         // Allocation to allocation copies
217         void (*allocData1D)(const Context *rsc,
218                             const Allocation *dstAlloc,
219                             uint32_t dstXoff, uint32_t dstLod, size_t count,
220                             const Allocation *srcAlloc, uint32_t srcXoff, uint32_t srcLod);
221         void (*allocData2D)(const Context *rsc,
222                             const Allocation *dstAlloc,
223                             uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
224                             RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
225                             const Allocation *srcAlloc,
226                             uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
227                             RsAllocationCubemapFace srcFace);
228         void (*allocData3D)(const Context *rsc,
229                             const Allocation *dstAlloc,
230                             uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff,
231                             uint32_t dstLod,
232                             uint32_t w, uint32_t h, uint32_t d,
233                             const Allocation *srcAlloc,
234                             uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff,
235                             uint32_t srcLod);
236 
237         void (*elementData1D)(const Context *rsc, const Allocation *alloc, uint32_t x,
238                               const void *data, uint32_t elementOff, size_t sizeBytes);
239         void (*elementData2D)(const Context *rsc, const Allocation *alloc, uint32_t x, uint32_t y,
240                               const void *data, uint32_t elementOff, size_t sizeBytes);
241 
242         void (*generateMipmaps)(const Context *rsc, const Allocation *alloc);
243 
244         void (*updateCachedObject)(const Context *rsc, const Allocation *alloc, rs_allocation *obj);
245     } allocation;
246 
247     struct {
248         bool (*init)(const Context *rsc, const ProgramStore *ps);
249         void (*setActive)(const Context *rsc, const ProgramStore *ps);
250         void (*destroy)(const Context *rsc, const ProgramStore *ps);
251     } store;
252 
253     struct {
254         bool (*init)(const Context *rsc, const ProgramRaster *ps);
255         void (*setActive)(const Context *rsc, const ProgramRaster *ps);
256         void (*destroy)(const Context *rsc, const ProgramRaster *ps);
257     } raster;
258 
259     struct {
260         bool (*init)(const Context *rsc, const ProgramVertex *pv,
261                      const char* shader, size_t shaderLen,
262                      const char** textureNames, size_t textureNamesCount,
263                      const size_t *textureNamesLength);
264         void (*setActive)(const Context *rsc, const ProgramVertex *pv);
265         void (*destroy)(const Context *rsc, const ProgramVertex *pv);
266     } vertex;
267 
268     struct {
269         bool (*init)(const Context *rsc, const ProgramFragment *pf,
270                      const char* shader, size_t shaderLen,
271                      const char** textureNames, size_t textureNamesCount,
272                      const size_t *textureNamesLength);
273         void (*setActive)(const Context *rsc, const ProgramFragment *pf);
274         void (*destroy)(const Context *rsc, const ProgramFragment *pf);
275     } fragment;
276 
277     struct {
278         bool (*init)(const Context *rsc, const Mesh *m);
279         void (*draw)(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len);
280         void (*destroy)(const Context *rsc, const Mesh *m);
281     } mesh;
282 
283     struct {
284         bool (*initStatic)(const Context *rsc, const Path *m, const Allocation *vtx, const Allocation *loops);
285         bool (*initDynamic)(const Context *rsc, const Path *m);
286         void (*draw)(const Context *rsc, const Path *m);
287         void (*destroy)(const Context *rsc, const Path *m);
288     } path;
289 
290     struct {
291         bool (*init)(const Context *rsc, const Sampler *m);
292         void (*destroy)(const Context *rsc, const Sampler *m);
293         void (*updateCachedObject)(const Context *rsc, const Sampler *s, rs_sampler *obj);
294     } sampler;
295 
296     struct {
297         bool (*init)(const Context *rsc, const FBOCache *fb);
298         void (*setActive)(const Context *rsc, const FBOCache *fb);
299         void (*destroy)(const Context *rsc, const FBOCache *fb);
300     } framebuffer;
301 
302     struct {
303         bool (*init)(const Context *rsc, ScriptGroup *sg);
304         void (*setInput)(const Context *rsc, const ScriptGroup *sg,
305                          const ScriptKernelID *kid, Allocation *);
306         void (*setOutput)(const Context *rsc, const ScriptGroup *sg,
307                           const ScriptKernelID *kid, Allocation *);
308         void (*execute)(const Context *rsc, const ScriptGroup *sg);
309         void (*destroy)(const Context *rsc, const ScriptGroup *sg);
310         void (*updateCachedObject)(const Context *rsc, const ScriptGroup *sg, rs_script_group *obj);
311     } scriptgroup;
312 
313     struct {
314         bool (*init)(const Context *rsc, const Type *m);
315         void (*destroy)(const Context *rsc, const Type *m);
316         void (*updateCachedObject)(const Context *rsc, const Type *s, rs_type *obj);
317     } type;
318 
319     struct {
320         bool (*init)(const Context *rsc, const Element *m);
321         void (*destroy)(const Context *rsc, const Element *m);
322         void (*updateCachedObject)(const Context *rsc, const Element *s, rs_element *obj);
323     } element;
324 
325     void (*finish)(const Context *rsc);
326 } RsdHalFunctions;
327 
328 
329 }
330 }
331 
332 #ifdef __cplusplus
333 extern "C" {
334 #endif
335 
336 bool rsdHalInit(RsContext, uint32_t version_major, uint32_t version_minor);
337 
338 #ifdef __cplusplus
339 }
340 #endif
341 
342 #endif
343